You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
3.0 KiB
Java

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;
}
}