Closed Fomovet closed 3 years ago
我做了很多测试,如果使用inflater.inflate()的方式返回View,经过父类AwesomeFragment中的onGetLayoutInflater()方法处理,可以把View添加到Fragment中,但如果使用FragmentTestBinding.inflate(inflater,container,false).getRoot()的方式返回View就无法处理,这里我十分不解,因为我查看FragmentTestBinding的源码实际上也是通过inflater.inflate()方法加载遍历,最后返回布局根节点作为View。
上面提供的参考连接它也是通过inflater.inflate()加载布局,如果使用ViewBinding应该如何加载呢?
@Fomovet 你好,经过我测试,可以这么解决
FragmentTestBinding testBinding;
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ViewGroup root = (ViewGroup)inflater.inflate(R.layout.framgent_test, container, false);
testBinding = FragmentTestBinding.bind(root.getChildAt(0));
return root;
}
因为我需要使用反射封装BaseFragment所以无法使用inflater.inflate(R.layout.framgent_test, container, false);方式返回View,这是我为什么执着于使用ViewBinding返回View的原因.
BaseFragment
public abstract class BaseFragment<T extends ViewBinding> extends AwesomeFragment {
protected T mBinding;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
mBinding = ViewBindingUtil.create(getClass(),inflater.from(getActivity()),container,false);
return mBinding.getRoot();
}
@Override
public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initEventAndData();
}
protected abstract void initEventAndData();
}
TestFragment继承BaseFragment
public class TestFragment extends BaseFragment<FramgentTestOneBinding> {
@Override
protected void initEventAndData() {
mBinding.mText.setText("");
}
}
目前我的解决办法是返回View的时候再添加一个FrameLayout:
public abstract class BaseFragment<T extends ViewBinding> extends AwesomeFragment {
protected T mBinding;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
mBinding = ViewBindingUtil.create(getClass(),inflater.from(getActivity()),container,false);
FrameLayout frameLayout = new FrameLayout(getActivity());
frameLayout.addView(mBinding.getRoot());
return frameLayout;
}
@Override
public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initEventAndData();
}
protected abstract void initEventAndData();
}
@Fomovet 不错的办法
测试版本:最新
问题描述:当NavigationFragmen容器中子Fragment布局使用ViewBinding加载后出现转换异常,如果把XML布局文件中的根布 局LinearLayoutCompat换成FragmentLayout那么ViewBinding的写法可以使用。
复现代码:
MainActivity
TestFragment
布局文件
异常信息