正文
上一章我们讲到了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}"/>
好了,今天的内容就到这里
网友评论