David202205 2022-09-28 15:41 采纳率: 0%
浏览 68

Android 使用viewBinding制作的BaseFragment在viewpager2中使用的时候不起作用

我的BaseFragment
public abstract class BaseFragment<T extends ViewBinding> extends Fragment {

    public T binding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Type type = this.getClass().getGenericSuperclass();
        if (type instanceof ParameterizedType) {
            // 如果支持泛型
            try {
                // 获得泛型中的实际类型,可能获得多个,[0]就是获得T的type
                Class<T> tClass = (Class<T>) ((ParameterizedType) type).getActualTypeArguments()[0];
                // 通过反射获取inflate
                Method method = tClass.getMethod("inflate", LayoutInflater.class, ViewGroup.class, Boolean.class);
                // 获得viewBinding实例
                binding = (T) method.invoke(null,getLayoutInflater(),container, false);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return binding.getRoot();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        init();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }

    protected abstract void init();
}


我的适配器类

public class ChartVPAdapter extends FragmentStateAdapter {

    private List<Fragment> fragments;

    public void setFragments(List<Fragment> f) {
        fragments.clear();
        fragments.addAll(f);
        notifyDataSetChanged();
    }

    public ChartVPAdapter(@NonNull FragmentActivity fragmentActivity) {
        super(fragmentActivity);
        fragments = new ArrayList<>();
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragments.get(position);
    }

    @Override
    public int getItemCount() {
        return fragments.size();
    }
}


只要一运行就会报
Attempt to invoke interface method 'android.view.View androidx.viewbinding.ViewBinding.getRoot()' on a null object reference

求解

  • 写回答

2条回答 默认 最新

  • 全栈CV工程师 2022-09-28 19:57
    关注
    
     dataBinding = DataBindingUtil.inflate(inflater, layoutId(), container, false)
    

    直接这样写就行了,,,用不上反射

    评论

报告相同问题?

问题事件

  • 创建了问题 9月28日

悬赏问题

  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?