package com.android.app_base.base.view;
|
|
import android.os.Bundle;
|
import android.view.LayoutInflater;
|
import android.view.View;
|
import android.view.ViewGroup;
|
|
import androidx.annotation.NonNull;
|
import androidx.annotation.Nullable;
|
import androidx.databinding.DataBindingUtil;
|
import androidx.databinding.ViewDataBinding;
|
import androidx.fragment.app.Fragment;
|
import androidx.lifecycle.Observer;
|
import androidx.lifecycle.ViewModelProvider;
|
|
import com.android.app_base.base.StateViewEnum;
|
import com.android.app_base.base.viewmodel.BaseViewModel;
|
|
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.Type;
|
|
/**
|
* @author Ljj
|
* @date 2023.03.02. 15:50
|
* @desc Fragment基类
|
*/
|
public abstract class BaseFragment<V extends ViewDataBinding,VM extends BaseViewModel> extends Fragment {
|
protected V binding;
|
protected VM viewModel;
|
private int viewModelId;
|
|
|
@Override
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
//页面参数初始化方法
|
initParam();
|
}
|
|
@Nullable
|
@Override
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
binding = DataBindingUtil.inflate(inflater,getLayoutId(), container, false);
|
return binding.getRoot();
|
}
|
|
@Override
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
super.onViewCreated(view, savedInstanceState);
|
//绑定 ViewDataBinding 和 ViewModel
|
initViewDataBindingAndViewModel();
|
//初始化状态视图
|
initStateView();
|
//页面view初始化方法
|
initView();
|
//页面数据初始化方法
|
initData();
|
//页面事件监听的方法,用于ViewModel层转到View层的事件注册
|
initLiveDataObserve();
|
}
|
@Override
|
public void onDestroyView() {
|
super.onDestroyView();
|
//解除Messenger注册
|
// Messenger.getDefault().unregister(viewModel);
|
|
if(binding != null){
|
binding.unbind();
|
}
|
}
|
|
|
/**
|
* ViewDataBinding和 ViewModel的获取及相关绑定
|
*/
|
private void initViewDataBindingAndViewModel() {
|
viewModelId = getVariableId();
|
viewModel = initViewModel();
|
//关联ViewModel
|
binding.setVariable(viewModelId, viewModel);
|
//支持LiveData绑定xml,数据改变,UI自动会更新
|
binding.setLifecycleOwner(this);
|
//让ViewModel拥有View的生命周期感应
|
getLifecycle().addObserver(viewModel);
|
|
}
|
|
/**
|
* 初始化ViewModel
|
* @return 返回一个ViewModel
|
*/
|
private VM initViewModel() {
|
Class<VM> vmClass;
|
Type type = getClass().getGenericSuperclass();
|
if (type instanceof ParameterizedType){
|
vmClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[1];
|
} else {
|
//如果没有指定泛型参数,则默认使用BaseViewModel
|
vmClass = (Class<VM>) BaseViewModel.class;
|
}
|
return new ViewModelProvider(this, (ViewModelProvider.Factory) ViewModelProvider.AndroidViewModelFactory.getInstance(requireActivity().getApplication())).get(vmClass);
|
}
|
|
/**
|
* 对状态视图liveData进行观察监听
|
*/
|
private void initStateView() {
|
viewModel.getStateViewLiveData().observe(getViewLifecycleOwner(), new Observer<StateViewEnum>() {
|
@Override
|
public void onChanged(StateViewEnum stateViewEnum) {
|
switch (stateViewEnum) {
|
case DIALOG_LOADING:
|
dialogLoading();
|
break;
|
case DIALOG_DISMISS:
|
dialogDismiss();
|
break;
|
case DATA_LOADING:
|
dataLoading();
|
break;
|
case DATA_ERROR:
|
dataError();
|
break;
|
case DATA_NULL:
|
dataNull();
|
break;
|
case NET_ERROR:
|
netError();
|
break;
|
case HIDE:
|
hide();
|
break;
|
default:
|
break;
|
}
|
}
|
});
|
}
|
/**
|
* 缺省页等状态视图的更新
|
* 有需求的,在子类选择重写
|
*/
|
protected void dialogLoading() {
|
}
|
protected void dialogDismiss() {
|
}
|
protected void dataLoading() {
|
}
|
protected void dataError() {
|
}
|
protected void dataNull() {
|
}
|
protected void netError() {
|
}
|
protected void hide() {
|
}
|
|
/**
|
* 获取根布局的id,由子类实现返回
|
* @return layout的id
|
*/
|
public abstract int getLayoutId();
|
|
/**
|
* 获取ViewModel的id,由子类实现返回
|
* @return BR中viewModel的id
|
*/
|
public abstract int getVariableId();
|
|
/**
|
* 初始化页面参数,例如从上一个activity传递过来的参数
|
*/
|
abstract void initParam();
|
|
/**
|
* 初始化页面view,例如一些view的隐藏或显示,以及点击逻辑等用户交互
|
*/
|
abstract void initView();
|
|
/**
|
* 初始化页面数据
|
*/
|
abstract void initData();
|
|
/**
|
* 初始化LiveData的监听
|
* 简单的数据展示可通过DataBinding直接双向绑定到xml中
|
*/
|
abstract void initLiveDataObserve();
|
|
}
|