Android MVVM + DataBinding的开发框架

2017-11-06  本文已影响0人  nmssdmf

1.mvc,mvp,mvvm

2. 神作databinding

  1. 废话不讲了,直接开始,感受神作的魅力
  2. 先看看以前的写法
  3. 再看看databinding的写法

3 总结

  1. Activity/Fragment代码量减少(提高开发效率,尤其是findViewById)
  2. databinding可以判断null值,不会报空指针
  3. 在布局中可以进行简单的表达式,减少java逻辑代码
  4. 0反射,全部在编译时期运行,不影响程序运行,性能超过手写代码
  5. 自动检测空指针,避免crash
  1. ide支持不完善,有时候需要build一下,建议一起把ide升级到最新,我也不是最新的
  2. 错误查找不方便

4 DataBinding简单教程

android {
    ...
    dataBinding {
        enabled = true
    }
}
<?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"
    tools:context="com.example.android.architecture.blueprints.todoapp.demo_mvvm.LoginOutActivity">

    <data>
         //数据部分
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        //布局部分
    </LinearLayout>
</layout>

    private ActivityLoginOutBinding activityLoginOutBinding;
    //onCreate
    activityLoginOutBinding = DataBindingUtil.setContentView(this, R.layout.activity_login_out);
    <data>

        <variable
            name="view"
            type="com.example.android.architecture.blueprints.todoapp.demo_mvvm.LoginOutActivity"/>

        <variable
            name="loginoutvm"
            type="com.example.android.architecture.blueprints.todoapp.demo_mvvm.LoginOutVM"/>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
         
        //binding属性, @={loginoutvm.username}表示数据ui双向绑定,ui变->数据变,数据变->ui变
        //@{loginoutvm.username} ui数据单向绑定, 数据变->ui变
        <EditText
            android:id="@+id/et_username"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:text="@={loginoutvm.username}"/>
        //binding方法
        <Button
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="20dp"
            android:text="登录"
            android:onClick="@{(v)view->login(v)}"
            />
    </LinearLayout>
  1. 数学表达式: + - / * %
  2. 字符串拼接 +
  3. 逻辑表达式 && ||
  4. 位操作符 & | ^
  5. 一元操作符 + - ! ~
  6. 位移操作符 >> >>> <<
  7. 比较操作符 == > < >= <=
  8. instanceof
  9. 分组操作符 ()
  10. 字面量 - character, String, numeric, null
  11. 强转、方法调用
  12. 字段访问
  13. 数组访问 []
  14. 三元操作符 ?:
  15. 聚合判断(Null Coalescing Operator)语法 ‘??’
    虽然支持这么多运算符,但还是建议,稍微复杂点的不要放在xml里进行
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <include
                bind:user="@{user}"
                layout="@layout/name"/>

            <include
                bind:user="@{user}"
                layout="@layout/contact"/>
        </LinearLayout>

不支持

        <merge>
            <include
                bind:user="@{user}"
                layout="@layout/name"/>

            <include
                bind:user="@{user}"
                layout="@layout/contact"/>
        </merge>
activityLoginOutBinding.addOnRebindCallback(new OnRebindCallback() {

            @Override
            public boolean onPreBind(ViewDataBinding binding) {
                ViewGroup viewGroup = (ViewGroup) binding.getRoot();
                TransitionManager.beginDelayedTransition(viewGroup);
                return true;
            }
        });
<data>
    <import type="com.example.User"/>
    <import type="java.util.List"/>
    <variable name="user" type="User"/>
    <variable name="userList" type="List<User>"/>
</data>

*Note: Android Studio does not yet handle imports so the autocomplete for imported variables may not work in your IDE. Your application will still compile fine and you can work around the IDE issue by using fully qualified names in your variable definitions.*
当使用List时候,ide会显示红色,但是能编译,这个是google官网给出的解释

上一篇下一篇

猜你喜欢

热点阅读