文档章节

android -------- MVP+DataBinding 的使用

切切歆语
 切切歆语
发布于 10/15 22:05
字数 563
阅读 10
收藏 1

天来说说MVP+DataBinding 的使用

 

以一个登录案例来讲解

 

 

 

布局:(ConstraintLayout 作为根布局)

<layout>


    <data>

        <variable
            name="onClick"
            type="com.zhangqie.mvplogin.LoginActivity.OnViewClick" />

    </data>

    <android.support.constraint.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".LoginActivity">

        <TextView
            android:id="@+id/tv1"
            android:layout_width="wrap_content"
            android:layout_height="45dp"
            android:gravity="center"
            android:text="账号:"
            android:textColor="@android:color/black"
            android:textSize="16dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.2"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.4" />

        <EditText
            android:id="@+id/et_name"
            android:layout_width="222dp"
            android:layout_height="45dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toRightOf="@+id/tv1"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.4" />

        <TextView
            android:id="@+id/tv2"
            android:layout_width="wrap_content"
            android:layout_height="45dp"
            android:gravity="center"
            android:text="密码:"
            android:textColor="@android:color/black"
            android:textSize="16dp"
            app:layout_constraintHorizontal_bias="0.2"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tv1" />

        <EditText
            android:id="@+id/et_pwd"
            android:layout_width="222dp"
            android:layout_height="45dp"
            app:layout_constraintLeft_toRightOf="@+id/tv2"
            app:layout_constraintTop_toBottomOf="@+id/et_name" />

        <Button
            android:id="@+id/btn_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="25dp"
            android:onClick="@{onClick.OnClickCommand}"
            android:text="登录"
            app:layout_constraintTop_toBottomOf="@+id/et_pwd" />


    </android.support.constraint.ConstraintLayout>
</layout>

 BaseActivity.Java

public abstract class BaseActivity<D extends ViewDataBinding,V,T extends BasePresenter<V>> extends AppCompatActivity{


    protected D viewDataBinding;
    protected T p;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewDataBinding = DataBindingUtil.setContentView(this, setMainLayout());
        p = createPresenter();
        p.attachView((V)this);
        initView();
        initBeforeData();
    }


    protected abstract T createPresenter();

    /***
     * 初始化布局
     */
    protected abstract int setMainLayout();

    /**
     * 初始化View
     */
    protected abstract void initView();

    /**
     * 初始化先前数据
     */
    protected abstract void initBeforeData();

    /***
     * 跳转Activity
     * @param mClass
     */
    protected void openActivity(Class<?> mClass) {
        openIntent(new Intent(this, mClass));
    }



    /**
     * 弹出toast 显示时长short
     *
     * @param msg
     */
    protected void showToastShort(String msg) {
        if (!TextUtils.isEmpty(msg)) {
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }
    }
    protected void showToastShort(int msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }


    protected void openIntent(Intent intent) {
        startActivity(intent);
    }

    protected void openForResultActivity(Intent intent, int requestCode){
        startActivityForResult(intent,requestCode);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (p != null){
            p.detachView();
        }

    }

}

Activity.java

public class LoginActivity extends BaseActivity<LoginMainBinding,IView,LoginPresenter> implements IView {

    @Override
    protected LoginPresenter createPresenter() {
        return new LoginPresenter();
    }

    @Override
    protected int setMainLayout() {
        return R.layout.login_main;
    }

    @Override
    protected void initView() {
        viewDataBinding.setOnClick(new OnViewClick());
    }

    @Override
    protected void initBeforeData() {

    }

    @Override
    public void showLoading(String msg) {
        showToastShort(msg);
    }

    public class OnViewClick {
        public void OnClickCommand(View view) {
            switch (view.getId()) {
                case R.id.btn_login:
                    p.showLogin(viewDataBinding.etName.getText().toString(),viewDataBinding.etPwd.getText().toString());
                    break;
            }
        }
    }
}

 效果图:

              

 

源码地址: https://github.com/DickyQie/android-databinding

 

总结:

  • 减少各层之间耦合,易于后续的需求变化,降低维护成本。

  • Presenter层独立于Android代码之外,可以进行Junit测试。

  • 接口和类较多,互相做回调,代码臃肿。

  • Presenter层与View层是通过接口进行交互的,接口粒度不好控制。

 

有不足之处,望指正

© 著作权归作者所有

共有 人打赏支持
切切歆语
粉丝 19
博文 318
码字总数 222171
作品 0
杭州
程序员
私信 提问
Android中attr自定义属性详解

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:wen=http://schemas.android.com/apk/res/com.iteye.googlers android:orientation="vertical" android:l......

惊浪
2015/04/27
0
0
Android自定义属性,format详解

reference:参考某一资源ID。 (1)属性定义: <declare-styleable name = "名称"> <attr name = "background" format = "reference" /> </declare-styleable> (2)属性使用: <ImageView a......

caikezhan
2012/04/07
0
0
Android官方提供的支持不同屏幕大小的全部方法

本文将告诉你如何让你的应用程序支持各种不同屏幕大小,主要通过以下几种办法: 让你的布局能充分的自适应屏幕 根据屏幕的配置来加载合适的UI布局 确保正确的布局应用在正确的设备屏幕上 提供...

带梦想一7飞
2013/06/05
0
0
declare-styleable中format详解

我们在做项目的时候,由于android自带的属性不能满足需求,android提供了自定义属性的方法,其中的format是做什么用的?以及如何使用它?下面列出一些常用的。 1. reference:参考某一资源I...

kiy
2014/04/14
0
0
android 自定义checkbox与文字的距离设置

改变checkbox默认的文字与选框之间的距离两种方案,刚刚开始接触checkbox 的时候由于不熟悉控件,使用了组合控件:一个未设定text的CheckBox和一个TextView来达到目的。后来发现只需要设定C...

NotFoundException
2014/05/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数据解析之XPath & lxml库

XPath 定义 即XML路径语言(XML Path Language),是一种用来确定XML文档中某部分位置的语言,它基于XML的树状结构,提供在数据结构树中寻找节点的能力,也适用于HTML文档中; 开发工具 Chrome...

村雨1943
6分钟前
0
0
day148-2018-11-15-英语流利阅读-待学习

赴美生子恐结束?特朗普中期选举憋大招 毛西 2018-11-15 1.今日导读 在 2013 年,一部《北京遇上西雅图》让赴美生子这个曾经神秘的话题吸引了很多关注。每年,数以万计的父母远赴美国,并在那...

飞鱼说编程
36分钟前
11
0
OSChina 周四乱弹 —— 每次我穿短裙的时候

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念 :分享DM DOKURO的单曲《Reality Check Through The Skull》: 差点以为手机卡了 《Reality Check Through The Skull》- DM DOKURO...

小小编辑
46分钟前
183
6
Windows 10 设置 Java 环境变量

首先你需要在我的电脑中打开,找到环境变量属性。 找到环境变量属性 找到环境变量属性后单击将会看到下面的设置界面。 在这个界面中设置高级系统设置。 环境变量 在弹出的界面中选择设置环境...

honeymose
今天
3
0
用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部