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();
            }
        });*/
    }
}
相关推荐
yatingliu201934 分钟前
HiveQL | 个人学习笔记
hive·笔记·sql·学习
郭庆汝35 分钟前
CMake概述用法详细笔记
笔记
张人玉38 分钟前
XML 序列化与操作详解笔记
xml·前端·笔记
风和日丽 随波逐流39 分钟前
java17学习笔记-Deprecate the Applet API for Removal
笔记·学习
淮北也生橘121 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
whysqwhw2 小时前
安卓图片性能优化技巧
android
风往哪边走2 小时前
自定义底部筛选弹框
android
Yyyy4823 小时前
MyCAT基础概念
android
Android轮子哥4 小时前
尝试解决 Android 适配最后一公里
android
yiqiqukanhaiba4 小时前
STM32学习笔记13-通信协议I2C&MPU6050&I2C软件控制
笔记·stm32·学习