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 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 vmClass; Type type = getClass().getGenericSuperclass(); if (type instanceof ParameterizedType){ vmClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[1]; } else { //如果没有指定泛型参数,则默认使用BaseViewModel vmClass = (Class) 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() { @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(); }