美文网首页Android架构
Android MVVM设计模式(事件处理)

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

作者: JYangkai | 来源:发表于2019-03-23 22:50 被阅读26次

    正文

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

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

    事件处理

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

    • 在xml布局中使用OnClickListener变量,然后在Activity或Fragment中调用
    • 在xml中定义控件id,然后直接在Activity或Fragment中使用Databinding调用
    • 在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}"/>
    

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

    相关文章

      网友评论

        本文标题:Android MVVM设计模式(事件处理)

        本文链接:https://www.haomeiwen.com/subject/acbevqtx.html