寒光博客

【Android】ViewModel-DataBinding小练习 将数据绑定到View 界面代码的解耦,简洁快明 及使用DataBinding需要的操作
Demo 将数据绑定到View 按下按钮 标签数字++ 代码 MyViewModel.java package ...
扫描右侧二维码阅读全文
21
2020/03

【Android】ViewModel-DataBinding小练习 将数据绑定到View 界面代码的解耦,简洁快明 及使用DataBinding需要的操作

Demo

将数据绑定到View
按下按钮 标签数字++

代码

MyViewModel.java

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

MainActivity.java

未使用DataBinding之前
每一次要将界面的控件要用变量连接
需要定义变量和关联绑定findViewById(),控件如果多起来写起来比较麻烦 而且有隐患。
比如删除了某个控件,界面发生改变 就需改很多地方

使用DataBinding需要的操作

layout文件转换为databinding形式
1.在gradle android defaultConfig写入

dataBinding{
  enabled true
}

如果报错出现:
Caused by: org.gradle.internal.resolve.ArtifactResolveException: Could not determine artifacts for androidx.lifecycle:lifecycle-runtime:2.1.0: No cached version available for offline mode
在dependencies中写入以下内容即可

   implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

2.在activity_main代码界面
点击 Convert to data Binding layout

data标签中写入

 <variable
            name="data"
            type="com.example.databinding.MyViewModel" />

将对象进行反向绑定(回绑定到界面上)
例如:

<TextView>
 android:id="@+id/textView"
 android:text="@{String.valueOf(data.number)}"
/>
<Button
 android:id="@+id/button"
 android:onClick="@{()->data.add()}"
/>

在使用DataBinding,运行时出现错误,检查发现DataBinderMapperImpl.java和BR.java都能自动生成,但报错找不到databBindingImpl类

import com.example.databinding.databinding.ActivityMainBindingImpl;

则需要重点检查databinding的界面语法,比如, @{  }中的内容。
比如我在android:onClick="@{()->data.add()}"中少写了方法后面的()

3.在MainAcitvity中就 有一个layout文件名字的类型,创建其变量即可

ActivityMainBinding binding;

所以使用 使用DataBinding之后 界面代码变得的解耦,简洁明快

package com.example.databinding;

import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProviders;

import android.os.Bundle;

import com.example.databinding.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {
    MyViewModel myViewModel;//管理数据
    ActivityMainBinding binding;//管理对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);//创建这个对象的绑定 xml的标签都会成为这个类的成员
        //可以直接 通过 binding.textView来访问TextView
        myViewModel =  ViewModelProviders.of(this).get(MyViewModel.class);
        binding.setData(myViewModel);//数据反向绑定 设置数据
        binding.setLifecycleOwner(this);//实现liveData的自我监听
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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="data"
            type="com.example.databinding.MyViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(data.number)}"
            android:textSize="36sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.372" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            android:onClick="@{()->data.add()}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.522" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
本文作者:Author:     文章标题:【Android】ViewModel-DataBinding小练习 将数据绑定到View 界面代码的解耦,简洁快明 及使用DataBinding需要的操作
本文地址:https://dxoca.cn/StudyNotes/329.html       百度已收录
版权说明:若无注明,本文皆为“Dxoca's blog (寒光博客)”原创,转载请保留文章出处。
Last modification:March 26th, 2020 at 09:56 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment