DataBinding简单操作

目前已经支持双向绑定,可以试着写一下MVVM了



Databinding 是google官方推出的一个数据绑定框架,使用这个可以不用再写finViewById了,而且xml以前只能写布局文件,用了之后xml文件还可以进行更多的操作

当然好处不止这一些,但有点可惜的是现在还不支持双向绑定,所以只建议自己写Demo的时候可以用下,项目的话现在不推荐使用。

开发工具Android Studio2.0

1.5前后的版本操作不一样,这里只说一下1.5版本及以后的使用

比较好的是已经内置了Databinding,想用的话只需要在gradle里面配置一下就行了。很方便

      dataBinding {
            //noinspection GroovyAssignabilityCheck
            enabled true
        }




xml的变化较大,以前是LinearLayout之类的布局作为跟布局,使用databinding之后跟布局只是一个简单的layout。


<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <!-- 有两种不同的实现方法,这里用的import -->

        <!--  <variable
            name="user"
            type="com.example.y.databindingdemo.User" /> -->


        <!--<import type="com.example.y.databindingdemo.User" />-->

        <!-- <variable
            name="user"
            type="User" />-->

        <variable
            name="userName"
            type="String" />

        <variable
            name="passWord"
            type="String" />

    </data>


    <!-- 这里放以前的根布局 
           可以塞数据给User类去显示userName和passWord
           然后 android:text="@{user.userName}"
           或者passWord
    -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{userName}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{passWord}" />


    </LinearLayout>


</layout>

以前的LinearLayout放在了layout里面。

data里面进行控件的数据填充或者属性。

可以看到有个variable,这个东西里面就指定type和name;

然后再控件中指定name


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{userName}" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{passWord}" />

这样就完成了简单的绑定,就可以在java类中去进行数据的填充,绑定数据还有另外一种方法,这个下文会提到

Activity和以往不同的是不在使用setContentView进行布局绑定了,databinding会自动生成一个类似于ActivityXXXBinding文件,

 ActivityXXbinding viewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
  

为了方便操作写一个BaseActivity让Demo中的activity去继承这个BaseActivity


public abstract class BaseActivity extends AppCompatActivity {

    ViewDataBinding viewDataBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewDataBinding = DataBindingUtil.setContentView(this, getLayoutId());
    }

    protected abstract int getLayoutId();
}

如果用IDE的快捷键会发现创建的是ViewDataBinding,而不直接是类似于ActivityXXBinding.这样我们在使用的时候哪个activity需要,就强转成那个Activity就Ok了。

ActivityMainBinding activityEasyBinding = (ActivityMainBinding) viewDataBinding;

前面创建了两个TextView,现在万事俱备只欠东风,可以在代码中去填充数据了

        activityEasyBinding.setUserName("ABCDEFG");
        activityEasyBinding.setPassWord("123456");

这样可以直接在代码中填充数据

如图所示


这样确实可以减少findviewbyid,但是有的时候不得不需要那个控件。有两种方法可以拿到那个控件,推荐第二种

 activityEasyBinding.userName.setText("HAHAHAHAHAHAHHAHA");

1.为控件起一个id为userName,这个时候就可以直接在代码中.userName拿到那个控件了。当然这个方法适合于只拿一次或者次数不多的地方,一旦项目代码量变多了,需要多处改变这个控件的text,那就不能到处都.userName了

2.

       TextView textView = activityEasyBinding.userName;
        textView.setText("HAHAHAHAHAAH");


可以看到两种办法都能使textview的text变动。

既然控件都能拿到那么setOnClickListener之类的同理也可以实现。



xml的data里面还有import属性可以指定需要的java类。

在这里简单的实现一个逻辑操作。

public class DataUtils {


    public static String up(String content) {
        if (content != null && content.isEmpty()) {
            return "输入框没有数据";
        }
        return content;
    }
}


写一个简单的逻辑判断

然后在xml文件中指定这个类


 <data>

        <import type="com.example.y.databindingdemo.data.DataUtils" />

        <import type="com.example.y.databindingdemo.data.User" />


        <variable
            name="user"
            type="User" />

        <variable
            name="btn"
            type="String" />

        <variable
            name="btnCoalescing"
            type="String" />

        <variable
            name="test"
            type="String" />

        <variable
            name="userNameHint"
            type="String" />

        <variable
            name="passWordHint"
            type="String" />

    </data>



还是有个textview去显示数据

          <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="@{DataUtils.up(test)}" />

text去直接调用那个utils里面的方法。




如果在fragment中使用,就不能像在activity中那么直接的setContentView了,

DataBindingUtil.inflate(inflater, getLayoutId(), container, false).getRoot();

getRoot();可以拿到需要的那个view。然后在fragment中进行操作


如果进行网络操作需要listview recyclerview之类的数据交互的话也可以直接在adapter里面使用databinding,确实方便了一些。但是感觉不支持双向绑定确实是一个遗憾,所以如果是我,我至少会等它支持双向绑定之后才会在项目中使用它。

最后上一张例子的效果图




Demo下载地址:git csdn

### 回答1: ViewBindingDataBinding都是Android开发中的数据绑定框架,它们可以将布局文件中的视图与代码中的变量绑定起来,从而方便地操作视图和数据。 ViewBindingAndroid官方在Android Studio 3.6中推出的一个新特性,它通过生成一个与布局文件对应的绑定类来实现视图绑定,可以避免findViewById的繁琐操作,提高代码的可读性和可维护性。 DataBinding是Google在Android Studio 1.3中推出的一个数据绑定框架,它可以将数据与视图绑定起来,实现双向绑定,从而简化了代码的编写和维护。使用DataBinding可以将视图的属性和数据模型的属性绑定起来,当数据模型的属性发生变化时,视图会自动更新,反之亦然。 总的来说,ViewBinding适用于简单的视图绑定场景,而DataBinding则适用于更复杂的数据绑定场景。 ### 回答2: ViewBindingDataBinding都是Android中的数据绑定库。它们旨在使应用程序中的 UI 和逻辑分离,同时还可以减少模板化代码。虽然它们都执行类似的任务,但它们之间存在一些区别。 首先,ViewBinding是针对单个视图文件生成绑定类。这样,在绑定代码中,您只能访问单个视图。因此,ViewBinding的代码量要比DataBinding少。 相比而言,DataBinding要复杂一些。 DataBinding不仅可用于绑定单个视图,还可用于绑定整个布局层次结构。它需要实现一整套工具来使数据绑定的代码与布局文件相对应。 其次,ViewBinding是使用annotation处理器生成绑定类的方式实现数据绑定,这意味着它可以相对快速地编译布局文件。另一方面,DataBinding需要生成额外的 Java 代码和一些 XML 文件来实现数据绑定,这使编译时间更长。 但是,DataBinding可以使用双向绑定技术,这意味着数据的变化可以直接反映到视图中。这使得在处理表单输入等特定场景时使用DataBinding会更容易一些。 总体而言,ViewBinding是更简单的选择,适合较小的项目,而DataBinding则更为复杂,适合需要大规模数据绑定的项目。它们都是可用的解决方案,您可以根据需求进行选择。 ### 回答3: ViewBindingDataBindingAndroid中的两种视图绑定库。两者的共同点是都可以通过自动生成的绑定类来实现视图的绑定,从而避免了findViewById的繁琐操作;不同点在于ViewBinding的目的是简化视图绑定,而DataBinding则可以实现更复杂的数据绑定和数据处理。 ViewBinding的主要作用是消除繁琐的findViewById操作,并且能够更好地保证类型安全。使用ViewBinding,我们只需要在需要进行视图绑定的Activity或Fragment中引入绑定类,然后通过绑定类实例来访问布局文件中所包含的所有控件。ViewBinding使用起来非常简单,只需要在build.gradle中添加如下配置即可: android { ... viewBinding { enabled = true } } 使用ViewBinding的代码示例: private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.textView.text = "Hello ViewBinding" } 对于DataBinding而言,它能够更好地实现数据绑定和数据处理,可以使用表达式将数据绑定到视图上,进行数据转换和格式化,从而实现更灵活的UI界面。使用DataBinding需要在build.gradle中添加如下配置: android { ... dataBinding { enabled = true } } 使用DataBinding的代码示例: <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="user" type="com.example.User" /> </data> <LinearLayout ... > <TextView ... android:text="@{user.name}" /> <TextView ... android:text="@{user.age,StringFormat}" /> <Button ... android:onClick="@{() -> user.onButtonClick()}" android:text="@{user.buttonText}" /> </LinearLayout> </layout> DataBinding可以更好地实现MVC中的数据与视图分离,也可以通过ViewModel和LiveData等技术实现MVVM模式。在使用DataBinding开发过程中,需要注意避免过于复杂的绑定表达式和数据转换等操作,以及注意内存泄漏的问题。 总的来说,ViewBindingDataBinding都是非常有用的Android开发库,可以根据具体的需求来选择使用哪种库,在提高开发效率的同时也能提升应用程序的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值