Android Studio 之 DataBing ,不需要再一个个findViewById了
阅读原文时间:2023年07月14日阅读:1

使用DataBinding,不需要再一个个findViewById了

1.在 build.gradel 中 添加下面语句
dataBinding{
enabled true
}

2.在 activity_main.xml 文件中 点小灯炮,自动生成 data 结点

3.在 MainActivity.java 中能得到一个新的类, ActivityMainBinding(此类取Activity名称,这个类不是固定的) ActivityMainBinding binding

4.对 绑定的实例 进行绑定 binding = DataBindingUtil.setContentView(this,R.layout.activity_main);

5.然后在MainActivity.java 文件中,直接用 binding.控件名,进行访问控件,不需要再像之前一样,一个个定义控件变量了,也不需要一个个控件进行 findViewById() 了

6.之前的 setContentView(R.layout.activity_main); 这句方法也不需要写了,直接屏蔽掉

7.在 activity_main.xml 文件中,对控件进行数据回绑

结点中声明 数据变量,
在 textView 或 其他内容控件中,都可以使用 data 这个变量进行数据绑定
如:android:text="@{String.valueOf(data.number)}" 直接把 MyViewModel 中的 number 值绑定到控件上
android:onClick="@{()->data.add()}" 调用 MyViewModel 中的方法

1. ViewModel 类

package com.example.databinding;

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

public class MyViewModel extends ViewModel {
private MutableLiveData number;
public MutableLiveData getNumber(){
if(number==null)
{
number = new MutableLiveData<>();
number.setValue(0);
}
return number;
}

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

}

2.MainActivity 类

package com.example.databinding;

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

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

import com.example.databinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
TextView textView;
Button button;
MyViewModel myViewModel;
ActivityMainBinding binding;

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);

    /\*  
    改造步骤:使用DataBinding  
    1.在 build.gradel 中 添加下面语句  
              dataBinding{  
                enabled true  
            }  
    2.在 activity\_main.xml 文件中 点小灯炮,自动生成 data 结点  
    3.在 MainActivity.java 中能得到一个新的类, ActivityMainBinding(此类取Activity名称,这个类不是固定的)  ActivityMainBinding binding  
    4.对 绑定的实例 进行绑定 binding = DataBindingUtil.setContentView(this,R.layout.activity\_main);  
    5.然后在MainActivity.java 文件中,直接用 binding.控件名,进行访问控件,不需要再像之前一样,一个个定义控件变量了,  
      也不需要一个个控件进行 findViewById() 了  
    6.之前的 setContentView(R.layout.activity\_main); 这句方法也不需要写了,直接屏蔽掉  
    7.在 activity\_main.xml 文件中,对控件进行数据回绑  
      <data>  
            <variable  
                name="data"  
                type="com.example.databinding.MyViewModel" />  
      </data>  
      在 <data> 结点中声明 数据变量,  
      在 textView 或 其他内容控件中,都可以使用 data 这个变量进行数据绑定  
      如:android:text="@{String.valueOf(data.number)}"     直接把 MyViewModel 中的 number 值绑定到控件上  
          android:onClick="@{()->data.add()}"               调用   MyViewModel 中的方法  
     \*/

    //setContentView(R.layout.activity\_main);  
    binding = DataBindingUtil.setContentView(this,R.layout.activity\_main);  
    /\*  
    textView = findViewById(R.id.textView);  
    button   = findViewById(R.id.button); \*/

    myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);  
    binding.setData(myViewModel);     //监听用它来替换了  
    binding.setLifecycleOwner(this);  //这句不能少,否则数据不显示  
    /\*  
    myViewModel.getNumber().observe(this, new Observer<Integer>() {  
                @Override  
                public void onChanged(Integer integer) {  
                    binding.textView.setText(String.valueOf(integer));  
                }  
            });

    binding.button.setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View view) {  
                    myViewModel.add();  
                }  
    });

     \*/

}  

}