Android架构

Android MVVM设计模式(事件处理)

2019-03-23  本文已影响26人  JYangkai

正文

上一章我们讲到了ViewModel和DataBinding的基本用法和结合在一起改如何用,今天我们来看看用这两者如何处理事件(比如单机事件,长按事件等)

我们之前在写代码的时候会把UI和一些事件逻辑全部写在Activity或者Fragment中,这在MVVM设计模式是不行的,所以我们要改变思想,将UI和逻辑数据分离

事件处理

我们可以把控件的事件处理写在Activity中,也可以写在ViewModel或其他类中,不过如果没有设计UI操作的话,还是尽可能写在ViewModel中,所以,事件处理有两种写法

下面我们来看具体怎么做

第一种(在xml布局中使用OnClickListener变量,然后在Activity或Fragment中调用)

我们先在布局中定义variable

<?xml version="1.0" encoding="utf-8"?>

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="onClickListener"
            type="android.view.View.OnClickListener"/>

        <variable
            name="viewModel"
            type="com.yk.jchat.MainViewModel"/>

    </data>

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

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@{viewModel.test}" />

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{onClickListener}"/>

    </LinearLayout>

</layout>

然后我们在Activity中实现OnClickListener接口,然后重写onClick方法

package com.yk.jchat;

import android.os.Bundle;
import android.view.View;

import com.yk.jchat.databinding.ActivityMainBinding;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    ActivityMainBinding mBinding;

    MainViewModel mViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        mViewModel= ViewModelProviders.of(this).get(MainViewModel.class);
        mBinding.setViewModel(mViewModel);
        mBinding.setLifecycleOwner(this);

        mViewModel.setTest("Hello World");
    }

    @Override
    public void onClick(View view) {
        
    }
}

我们就可以在onClick方法中处理事件了

第二种(在xml中定义控件id,然后直接在Activity或Fragment中使用Databinding调用)

我们可以直接给button定义一个id

<Button
    android:id="@+id/main_btn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{onClickListener}"/>

然后直接在Activity中调用

mBinding.mainBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        
    }
});

第三种(在ViewModel或者其他类中定义相关方法,然后布局中引入并调用)

我们在ViewModel中定义方法

package com.yk.jchat;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

public class MainViewModel extends ViewModel {

    public MutableLiveData<String> test=new MutableLiveData<>();

    public void onClick(){

    }
}

然后改变下Button的onClick

<Button
    android:id="@+id/main_btn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:onClick="@{viewModel::onClick}"/>

好了,今天的内容就到这里

上一篇 下一篇

猜你喜欢

热点阅读