|
|
|
|
package com.xypower.wpywapp.page;
|
|
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
import android.util.SparseArray;
|
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
|
import android.view.View;
|
|
|
|
|
import android.view.ViewGroup;
|
|
|
|
|
import android.widget.TextView;
|
|
|
|
|
|
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
|
|
|
import androidx.databinding.DataBindingUtil;
|
|
|
|
|
import androidx.databinding.ViewDataBinding;
|
|
|
|
|
import androidx.fragment.app.Fragment;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create by KunMinX at 19/7/11
|
|
|
|
|
*/
|
|
|
|
|
public abstract class DataBindingFragment extends Fragment {
|
|
|
|
|
|
|
|
|
|
protected AppCompatActivity mActivity;
|
|
|
|
|
private ViewDataBinding mBinding;
|
|
|
|
|
private TextView mTvStrictModeTip;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onAttach(@NonNull Context context) {
|
|
|
|
|
super.onAttach(context);
|
|
|
|
|
mActivity = (AppCompatActivity) context;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected abstract void initViewModel();
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
|
|
|
|
super.onCreate(savedInstanceState);
|
|
|
|
|
|
|
|
|
|
initViewModel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected abstract DataBindingConfig getDataBindingConfig();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* TODO tip: 警惕使用。非必要情况下,尽可能不在子类中拿到 binding 实例乃至获取 view 实例。使用即埋下隐患。
|
|
|
|
|
* 目前方案是于 debug 模式,对获取实例情况给予提示。
|
|
|
|
|
* <p>
|
|
|
|
|
* 如这么说无体会,详见 https://xiaozhuanlan.com/topic/9816742350 和 https://xiaozhuanlan.com/topic/2356748910
|
|
|
|
|
*
|
|
|
|
|
* @return binding
|
|
|
|
|
*/
|
|
|
|
|
protected ViewDataBinding getBinding() {
|
|
|
|
|
return mBinding;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Nullable
|
|
|
|
|
@Override
|
|
|
|
|
public View onCreateView(
|
|
|
|
|
@NonNull LayoutInflater inflater,
|
|
|
|
|
@Nullable ViewGroup container,
|
|
|
|
|
@Nullable Bundle savedInstanceState
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
|
|
DataBindingConfig dataBindingConfig = getDataBindingConfig();
|
|
|
|
|
|
|
|
|
|
//TODO tip: DataBinding 严格模式:
|
|
|
|
|
// 将 DataBinding 实例限制于 base 页面中,默认不向子类暴露,
|
|
|
|
|
// 通过这方式,彻底解决 视图调用一致性问题,
|
|
|
|
|
// 如此,视图调用安全性将与基于函数式编程思想 Jetpack Compose 持平。
|
|
|
|
|
|
|
|
|
|
// 如这么说无体会,详见 https://xiaozhuanlan.com/topic/9816742350 和 https://xiaozhuanlan.com/topic/2356748910
|
|
|
|
|
|
|
|
|
|
ViewDataBinding binding = DataBindingUtil.inflate(inflater, dataBindingConfig.getLayout(), container, false);
|
|
|
|
|
binding.setLifecycleOwner(getViewLifecycleOwner());
|
|
|
|
|
binding.setVariable(dataBindingConfig.getVmVariableId(), dataBindingConfig.getStateViewModel());
|
|
|
|
|
SparseArray<Object> bindingParams = dataBindingConfig.getBindingParams();
|
|
|
|
|
for (int i = 0, length = bindingParams.size(); i < length; i++) {
|
|
|
|
|
binding.setVariable(bindingParams.keyAt(i), bindingParams.valueAt(i));
|
|
|
|
|
}
|
|
|
|
|
mBinding = binding;
|
|
|
|
|
return binding.getRoot();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onDestroyView() {
|
|
|
|
|
super.onDestroyView();
|
|
|
|
|
mBinding.unbind();
|
|
|
|
|
mBinding = null;
|
|
|
|
|
}
|
|
|
|
|
}
|