示例代码如下:
package com.example.dell.basebindingadaptertest.act;
import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelStore;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.CheckResult;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.example.dell.basebindingadaptertest.constant.Constant;
import com.example.dell.basebindingadaptertest.utils.ClassUtil;
import com.example.dell.basebindingadaptertest.utils.StatusBarUtil;
import com.trello.rxlifecycle2.LifecycleProvider;
import com.trello.rxlifecycle2.LifecycleTransformer;
import com.trello.rxlifecycle2.RxLifecycle;
import com.trello.rxlifecycle2.android.ActivityEvent;
import com.trello.rxlifecycle2.android.RxLifecycleAndroid;
import io.reactivex.Observable;
import io.reactivex.subjects.BehaviorSubject;
/**
* Created by chentao
* Date:2019/3/19
* Description:如果这里继承的是RxActivity 因为RxActivity的父类是Activity它没有提供getSuppportFragmentManager方法
* 所以这里要继承自FragmentActivity或者AppCompatActivity
*/
public abstract class JavaMvvmActivity<VM extends ViewModel,T extends ViewDataBinding> extends AppCompatActivity implements LifecycleProvider<ActivityEvent> {
protected final String TAG="gdchent";
protected T binding=null ;
protected ViewModel VM;
protected abstract int getLayloutId() ;
protected Context context;
protected abstract void init();
protected SharedPreferences sp=null;
//实现生命周期控制
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
@NonNull
@CheckResult
public final Observable<ActivityEvent> lifecycle() {
return lifecycleSubject.hide();
}
@Override
@NonNull
@CheckResult
public <T> LifecycleTransformer<T> bindUntilEvent(ActivityEvent event) {
return RxLifecycle.bindUntilEvent(lifecycleSubject, event);
}
@NonNull
@CheckResult
@Override
public <T> LifecycleTransformer<T> bindToLifecycle() {
return RxLifecycleAndroid.bindActivity(lifecycleSubject);
}
@Override
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding=DataBindingUtil.setContentView(this,getLayloutId());
context=this;
sp=getSharedPreferences(Constant.SP_NAME, Context.MODE_PRIVATE);
initViewModel();
init();
setOnlickListener();
lifecycleSubject.onNext(ActivityEvent.CREATE);
//ContextCompat.getColor(this,android.R.color.holo_red_dark
StatusBarUtil.setTranslucentForImageView(this,binding.getRoot() );
}
//在基类 通过泛型初始化ViewModel利用反射
protected void initViewModel(){
Class<ViewModel> viewModelClass=ClassUtil.getViewModel(this);
if(viewModelClass!=null) {
ViewModelStore viewModelStore=new ViewModelStore();
//通过viewModelProvider
ViewModelProvider viewModelProvider = new ViewModelProvider(viewModelStore,new ViewModelProvider.AndroidViewModelFactory(getApplication()));
VM=viewModelProvider.get(viewModelClass);
}
}
protected void setOnlickListener(){}
//打开Activity
protected void startActivity(Context context,Class clazz){
Intent intent=new Intent(context,clazz);
startActivity(intent);
}
protected void startActivityAndBundle(Context context,Class clazz,Bundle bundle){
Intent intent=new Intent(context,clazz);
intent.putExtra(Constant.BUNDLE_NAME,bundle);
startActivity(intent);
}
@Override
@CallSuper
protected void onStart() {
super.onStart();
lifecycleSubject.onNext(ActivityEvent.START);
}
@Override
@CallSuper
protected void onResume() {
super.onResume();
lifecycleSubject.onNext(ActivityEvent.RESUME);
}
@Override
@CallSuper
protected void onPause() {
lifecycleSubject.onNext(ActivityEvent.PAUSE);
super.onPause();
}
@Override
@CallSuper
protected void onStop() {
lifecycleSubject.onNext(ActivityEvent.STOP);
super.onStop();
}
@Override
@CallSuper
protected void onDestroy() {
lifecycleSubject.onNext(ActivityEvent.DESTROY);
super.onDestroy();
}
}
泛型化工具代码:
public class ClassUtil {
/**
* 获取泛型ViewModel的class对象
*/
public static <T> Class<T> getViewModel(Object obj) {
Class<?> currentClass = obj.getClass();
Class<T> tClass = getGenericClass(currentClass, AndroidViewModel.class);
if (tClass == null || tClass == AndroidViewModel.class || tClass == NoViewModel.class) {
return null;
}
return tClass;
}
private static <T> Class<T> getGenericClass(Class<?> klass, Class<?> filterClass) {
Type type = klass.getGenericSuperclass();
if (type == null || !(type instanceof ParameterizedType)) return null;
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] types = parameterizedType.getActualTypeArguments();
for (Type t : types) {
Class<T> tClass = (Class<T>) t;
if (filterClass.isAssignableFrom(tClass)) {
return tClass;
}
}
return null;
}
}
例如子类Act代码如下:
/**
* 主页面一个Framelayout
* 实现逻辑
*/
public class JavaMainActivity extends JavaMvvmActivity<JavaMainViewModel,ActivityJavaMainBinding> {
@Override
protected int getLayloutId() {
return R.layout.activity_java_main;
}
@Override
protected void init() {
//binding.setVm(VM);
binding.setVariable(BR.vm,VM);
//Framelyaout 添加子的Fragment 动态添加
/**
* 实现思路是 通过FragmentManager来动态添加
*/
//第一步 获取FragmentManager
FragmentManager fm =getSupportFragmentManager();
ViewPagerFragment viewPagerFragment = new ViewPagerFragment();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.container, viewPagerFragment, ViewPagerFragment.VP_FRAGMENT_TAG);
ft.commit();
}
}
通过xml绑定ViewModel示例代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="vm"
type="com.example.dell.basebindingadaptertest.viewmodel.JavaMainViewModel" />
</data>
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</layout>
总结:每个Act或者Frag绑定一个viewModel ,一般Viewmodel是跟xml进行绑定,所以初始化viewModel在获取viewDatabinding之后
详细代码参见github传送门:
https://github.com/gdchent/BaseBindingAdapter











网友评论