当前位置: 首页 > article >正文

Android : DataBinding 简化开发 简单应用

1.导包 ViewModel 用于观察数据

// 使用androidx版本库
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0-alpha03'

2.在build.gradle 添加  在android 代码块中添加  复制后点更新(Sync Now)


android{
    ...

    // 步骤1.开启data binding
    dataBinding {
        enabled = true
    }

    ...
}

3.写个类继承 ViewModel

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 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

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


http://www.kler.cn/a/157481.html

相关文章:

  • 【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例
  • Redis应用—9.简单应用汇总
  • [Unity] 【VR】【游戏开发】在VR中使用New Input System获取按键值的完整教程
  • 基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】
  • 单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
  • 【Unity】【VR开发】实现VR屏幕共享应用的几个重要插件和参考资料分享
  • 深入理解Zookeeper系列-4.Watcher原理
  • DevOps搭建(三)-Git安装详细步骤
  • 软件测试要学习的基础知识——黑盒测试
  • ERPNext SQL 注入漏洞复现
  • 如何选择适合的香港服务器托管服务
  • vue计算排列布局
  • 西南科技大学模拟电子技术实验六(BJT电压串联负反馈放大电路)预习报告
  • 使用Java语言判断一个数据类型是奇数还是偶数
  • 新华三数字大赛复赛知识点 网络访问控制
  • JFrog----SBOM清单包含哪些:软件透明度的关键
  • sqlmap400报错问题解决
  • 未势能源亮相中国燃料电池汽车大会,助力京津冀“氢能高速”
  • 【Azure 架构师学习笔记】- Azure Databricks (1) - 环境搭建
  • Django回顾5 - 多表操作、其它字段和字段参数、中间表的三种创建方式
  • 国产API调试插件:Apipost-Helper
  • JVM Optimization Learning(五)
  • vue3使用vuex 集中式管理状态数据
  • 6、原型模式(Prototype Pattern,不常用)
  • 从遍历到A星寻路
  • 备忘录不小心删了怎么办?如何找回我的备忘录?