ArrayAdapter内启动新Fragment时出现NullPointerException求助
解决ArrayAdapter中按钮点击启动Fragment时的NullPointerException问题
你遇到的空指针问题根源很明确:你刚new出来的Apply Fragment还没有被任何FragmentManager关联,所以调用fragment.getFragmentManager()肯定会返回null。正确的做法是从你的宿主Fragment(也就是FullTimeJobs)或者宿主Activity中获取有效的FragmentManager实例。
下面是具体的修复步骤和代码修改:
步骤1:完善Adapter的构造方法,传入宿主Fragment引用
你的Adapter里已经定义了mFragment变量,但没有初始化。我们需要在创建Adapter时把宿主Fragment传进去:
public class FullTimeAdapter extends ArrayAdapter<Datalist> { private Context mContext; private FullTimeJobs mFragment; private List<Datalist> datalists = new ArrayList<>(); // 修改构造方法,添加宿主Fragment参数 public FullTimeAdapter(@NonNull Context context, ArrayList<Datalist> list, FullTimeJobs fragment) { super(context, 0, list); mContext = context; datalists = list; mFragment = fragment; // 初始化宿主Fragment引用 } // ... 其他代码 }
在你的FullTimeJobs Fragment中创建Adapter时,传入this即可:
FullTimeAdapter adapter = new FullTimeAdapter(getContext(), datalistList, this);
步骤2:修改按钮点击事件,使用宿主Fragment的FragmentManager
把原来从新Fragment获取FragmentManager的代码,改成从宿主Fragment获取:
btnApply.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Fragment fragment = new Apply(); // 从宿主Fragment获取有效的FragmentManager FragmentManager fm = mFragment.getFragmentManager(); // 如果使用的是AndroidX/support库,改用getSupportFragmentManager() // FragmentManager fm = mFragment.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.container, fragment); ft.addToBackStack(null); // 可选:添加到返回栈,方便用户返回上一个Fragment ft.commit(); } });
额外注意:避免内存泄漏
如果你的Adapter生命周期可能比宿主Fragment长,建议用WeakReference持有宿主Fragment的引用,防止内存泄漏:
private WeakReference<FullTimeJobs> mFragmentRef; // 构造方法里改成: mFragmentRef = new WeakReference<>(fragment); // 点击事件里获取: FullTimeJobs fragment = mFragmentRef.get(); if (fragment != null) { FragmentManager fm = fragment.getFragmentManager(); // ... 后续事务代码 }
为什么原来的代码会报错?
当你调用new Apply()创建Fragment实例时,它还没有被添加到任何FragmentManager中,此时getFragmentManager()会返回null。只有当Fragment被通过FragmentTransaction添加到FragmentManager后,这个方法才会返回有效的实例。所以必须从已经依附于FragmentManager的宿主组件(宿主Fragment/Activity)中获取FragmentManager。
内容的提问来源于stack exchange,提问作者chand mohd
相关产品推荐
相关产品推荐

