zoukankan      html  css  js  c++  java
  • MVVM模式

    MVVM的最大缺点貌似是,报错后不好找,
    在安卓6.0的时候出现了一个工具叫做databinding,其中呢主要是用来帮助实现MVVM模式的快速开发
     
    在使用databinding的时候我们需要做的工作有一下几点:
    (仅支持studio,eclipse想使用MVVM手写去吧)
    在使用databinding的时候我们需要做的工作有一下几点:
    (仅支持studio,eclipse想使用MVVM手写去吧)
    首先要下载需要的包
    1.在SDKMannager中下载
     
    2.配置支持包
    第一种方式:在整个项目中的build.gradle配置(2.0 之前的 Android Studio)
    依赖 DataBinder 这个库
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'
        classpath 'com.android.databinding:dataBinder:1.0-rc0'//加入这句话
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
     
     
    然后再在使用的 module中最上边(文件) 配置
    apply plugin: 'com.android.databinding'
    -------------------------------------华丽的分割线---------------------------------------
    经测试,这种本人测试失败,报错如下,不知道是否是跟版本有关系,我的猜测来自下边知乎网友的回答
    重点报错:如果是2.0之后的studio使用的以上的配置
    原因分析:
    知乎用户 Android/C++/Lua/Python/杂七杂八
    于 2015.12.15 更新:
    最近 Android Studio 升级到了 2.0 版本,发现不需要从 jcenter 中再依赖 DataBinder 这个库了,2.0 之后的 Android Studio 版本内置就支持了 DataBiding,也不需要在 build.gradle 中添加 com.android.databinding 这个 Plugin 了。使用方式如下:
    1、在 Project 的 build.gradle 配置中,使用 1.5.0 以上的 Gradle 版本;
    2、在使用 DataBinding 的 Module 中,如下配置:
    android {
        ....
        dataBinding {
            enabled = true
        }}
    详细信息请关注官方开发者论坛,里面会随时更新:
    ------------------------华丽的分割线---------------------------------------
     
    第二种:在module中配置(推荐studio 2.0以后的使用这种)
    在需要使用的module中android下配置
    dataBinding{
        enabled=true
    }
     
     
     
    使用方式如下:
    布局文件:
    main布局文件
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools">
    <!--当前数据来源-->
    <data>
    <!--variable变量这里的数据由ActivityMainBinding的setXXX传入的
    name相当于是在这个xml文件中使用时候的对象名也是new出后的对象名,
    这里的name与ActivityMainBinding的setXXX中使用的是相同的,相当于接收参数的对象名
    type指的是什么样的类型对象,相当于用来接收参数类型-->
    <variable
    name="user"
    type="com.example.lizhanqi.mvvmdemo.bean.User" />

    </data>
    <!--往下是正常的布局-->
    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!--引用时候的不同点:这里设置text与以往不同android:text="@{bean.phone}"
    这里{}中的bean来自上边定义的数据对象名称
    -->
    <TextView

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.name}" />
    <!--引用布局,其中需要传入数据
    bind:myuser="@{user}
    bind是文件头部自定义的命名空间
    myuser是引用布局的对象,
    @{user} 是传入的数据对象
    -->
    <include
    layout="@layout/my_layout"
    bind:myuser="@{user}" />
    <!--他妈蛋的MVVM就是个垃圾货色,没必要研究了addTextChangedListener使用不了报错,
    设置控件的显示也完蛋报错,android:visibility="@{user.isshow ? View.VISIBLE : View.GONE}"
    教程没问题,偏偏我这里就不行,MVVM据说还他妈的是后期报错维护难,
    果断舍弃,浪费生命

    -->
    <!-- <EditText
    android:addTextChangedListener="@{user.address}"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />


    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.address}" />-->
    </LinearLayout>
    </layout>


     
    ===========华丽的分割线========================
    引用的布局文件my_layout的布局文件
     
        <!--这里与平时用法基本相同-->

    <layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <!--当前数据来源-->
    <data>
    <!--variable变量,这里的数据是由引用者传入数据
    name相当于是在这个xml文件中使用时候的对象名也是new出后的对象名,
    这里的name与ActivityMainBinding的setXXX中使用的是相同的,相当于接收参数的对象名
    type指的是什么样的类型对象,相当于用来接收参数类型-->
    <variable
    name="myuser"
    type="com.example.lizhanqi.mvvmdemo.bean.User"/>
    </data>
    <!--往下是正常的布局-->
    <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!--引用时候的不同点:这里设置text与以往不同android:text="@{bean.phone}"
    这里{}中的bean来自上边定义的数据对象名称
    -->
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{myuser.sex}" />
    </LinearLayout>
    </layout>


     
    ------==============华丽的分割线=====================------------
    activity的java中

    import android.databinding.DataBindingUtil;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;

    import com.example.lizhanqi.mvvmdemo.bean.User;
    import com.example.lizhanqi.mvvmdemo.databinding.ActivityMainBinding;

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //设置界面 设置界面不在使用activity提供的,
            //setContentView(R.layout.activity_main);
            //使用的是 DataBindingUtil的setContentView(Activity activity, int layoutId) ;
            //返回使用的是ActivityMainBinding不是提醒器的ViewDataBinding
            ActivityMainBinding viewDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);//绑定view层
            //初始化实力module
            User user = new User();
            user.setName("lizhanqi");
            user.setSex("男");
            user.setAge("21");
            //这里的setXXX是来自你定义在xml文件引用的对象名
            viewDataBinding.setUser(user);//绑定module层
        }
    }
    ++++++++++++++++++华丽的分割线++++++++++++++++++++++++++++++++++++
    javabean只是对User进行了简单的封装
    public class User {
         String name;
         String sex;
         String age;
         String address;
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }

        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }
    }
     
    ***************使用心得及吐槽****************************
     
     
    在使用的过程中报错很多不知道原因,其中有,以及刚才上边说的,控制控件显示不顶用,获取输入字符监听无效,以及最后的R包也出现了不知名的问题,
    (com.example.lizhanqi.mvvmdemo.的R包,纠结了(最后找了下分包问题,日了动物园了))
    总共这点小东西报错差不多有十种了,因此如果咋项目中使用,以后有的受了
    身心疲惫,学习历程没见过这么费劲的玩意,放弃了学H5去了
    (效果现在不敢保证了,中间效果出来过,就两个简单的显是姓名,以及性别)
     
     
  • 相关阅读:
    移动安全
    Photoshop笔记
    ARMv7 与 ARMv8对比
    centos系统 网络配置
    视频大文件压缩
    开发者必备Linux命令
    开发者必备Docker命令
    文件服务器minio
    Java 图片Base64
    socket
  • 原文地址:https://www.cnblogs.com/lizhanqi/p/5911712.html
Copyright © 2011-2022 走看看