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();
            }
        });*/
    }
}
相关推荐
赏金术士12 小时前
Kotlin 习题集 · 高级篇
android·开发语言·kotlin
薛定e的猫咪14 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法
AOwhisky14 小时前
虚拟化技术学习笔记
linux·运维·笔记·学习·虚拟化技术
一只机电自动化菜鸟14 小时前
一建机电备考笔记(33) 机电专业技术(起重技术-吊装方案)(含考频+题型)
经验分享·笔记·学习·职场和发展·课程设计
问心无愧051314 小时前
ctf show web 入门42
android·前端·android studio
没什么本事15 小时前
关于C# panel 添加lable问题 -- 明确X和Y 位置错误
android·java·c#
小陈phd16 小时前
多模态大模型学习笔记(四十)——从“看字”到“懂结构”:版面分析与表格解析技术全解
笔记·学习
xuhaoyu_cpp_java16 小时前
SpringMVC学习(二)
java·经验分享·笔记·学习·spring
噜噜噜阿鲁~17 小时前
python学习笔记 | 9.2、模块-安装第三方模块
笔记·python·学习
我胖虎不答应!!18 小时前
Three.js开发思想笔记
javascript·笔记·three.js