Android Studio of DataBing, do not need a one findViewById

Use DataBinding, you do not need a one findViewById

1. Add the following statement in build.gradel
DataBinding {
Enabled to true
}


2. In the small bulbs midpoint activity_main.xml file, node data generated automatically

3. resulting in a new class of energy MainActivity.java, ActivityMainBinding (Activity take such name, the class is not fixed) ActivityMainBinding binding

4. Examples of binding binding binding = DataBindingUtil.setContentView (this, R.layout.activity_main);

5. Then MainActivity.java file directly binding. Control name, access control, and do not need as before, one definition of control variables, and does not need one controls are findViewById () the

Before 6. setContentView (R.layout.activity_main); phrase method does not need to write, direct masked

7. In activity_main.xml file, the control data for bindback
<data>
<variable
name = "Data"
type = "com.example.databinding.MyViewModel" />
</ Data>
statement <data> in node data variables,
in textView or other content control, can use data binding variable data
such as: android: text = "@ {bind directly to the number of values MyViewModel the control
android: onClick = "@ {(of the method call MyViewModel

 

1. ViewModel class

package com.example.databinding;

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

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

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

  

2.MainActivity Deliverable

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();
                    }
        });

         */


    }
}

  

Guess you like

Origin www.cnblogs.com/gfwei/p/11779458.html