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();
            }
        });*/
    }
}
相关推荐
清风一徐9 小时前
禅道从18.3升级到21.7.6版本
笔记
Jack___Xue9 小时前
LangChain实战快速入门笔记(六)--LangChain使用之Agent
笔记·langchain·unix
零度@9 小时前
SQL 调优全解:从 20 秒到 200 ms 的 6 步实战笔记(附脚本)
数据库·笔记·sql
村里小码农9 小时前
Android APP之间共享数据
android·contentprovider·contentresolver·android app数据共享
Jerry10 小时前
Navigation 最佳实践
android
im_AMBER10 小时前
Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离
笔记·学习·算法·leetcode
Just_Paranoid10 小时前
【Android UI】Android 颜色的表示和获取使用指南
android·ui·theme·color·attr·colorstatelist
louisgeek10 小时前
Android Charles Proxy 抓包
android
其美杰布-富贵-李10 小时前
HDF5文件学习笔记
数据结构·笔记·学习
d111111111d12 小时前
在STM32函数指针是什么,怎么使用还有典型应用场景。
笔记·stm32·单片机·嵌入式硬件·学习·算法