Android : DataBinding 简化开发 简单应用

1.导包 ViewModel 用于观察数据

复制代码
// 使用androidx版本库  ViewModelProviders
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03'

2.在build.gradle 添加 在android 代码块中添加 复制后点更新(Sync Now)

复制代码
android{
    ...

    // 步骤1.开启data binding
    dataBinding {
        enabled = true
    }

    ...
}



//或者

android{
    ...
    defaultConfig{
        ...
         dataBinding.enabled true
    }

}

3.写个类继承 ViewModel

java 复制代码
package com.example.mydatabinding;


import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class MyViewModel extends ViewModel {

    private MutableLiveData<Integer> data;

    public MutableLiveData<Integer> getData() {
        if(data == null){
            data = new MutableLiveData<>();
            data.setValue(0);
        }
        return data;
    }

    public void add(){
        data.setValue(data.getValue() + 1);
    }
}

4.修改xml activity_main.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<!-- 步骤2. 点击小灯泡生成新的xml -->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="dataIs"
            type="com.example.mydatabinding.MyViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <!--
        设置数据
        android:text="@{String.valueOf(dataIs.data)}"
         -->
        <TextView
            android:textSize="24sp"
            android:id="@+id/tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(dataIs.data)}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.526"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.191" />

        <!--
        点击事件 调用类中的方法
        android:onClick="@{() -> dataIs.add()}"
        -->
        <Button
            android:onClick="@{() -> dataIs.add()}"
            android:id="@+id/btn_test"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/btn_txt"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.528"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.33" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

5.简化后的代码 MainActivity.java

java 复制代码
package com.example.mydatabinding;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;


import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.mydatabinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    private MyViewModel myViewModel;

//    private TextView textView;
//    private Button button;
    //3.xml重新生成后就有了 ActivityMainBinding 对象,不是固定的 ,根据layout中起的名字 会生成不同的Binding对象
    private ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //就可以不用了
//        setContentView(R.layout.activity_main);
        //获取到xml主布局中的所有的view
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
//
//        button = findViewById(R.id.btn_test);
//        textView =findViewById(R.id.tv_content);

        myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
        // xml 中的 dataIs
        binding.setDataIs(myViewModel);
        binding.setLifecycleOwner(this); //观察

        //观察 也可消掉
       /* myViewModel.getData().observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                //内容发生改变
//                textView.setText(String.valueOf(integer));
                binding.tvContent.setText(String.valueOf(integer));
            }
        });
*/
        //事件 也可以消掉
        /*binding.btnTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用 方法
                myViewModel.add();
            }
        });*/
    }
}
相关推荐
Kapaseker2 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴3 小时前
Android17 为什么重写 MessageQueue
android
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android