点击Fragment内按钮刷新同Fragment时应用崩溃求助
问题分析与解决方案
崩溃原因
你的代码崩溃大概率是因为frg对象为null:
- ViewPager默认开启预加载(
offscreenPageLimit=1),只保留当前页面及左右相邻的Fragment实例,非缓存范围内的Fragment会被销毁。当你通过findFragmentByTag查找pos=4的Fragment时,如果该页面不在缓存中,就会返回null,后续调用detach(frg)时触发空指针异常。 - 另外,你是在当前Fragment内操作刷新自己,完全不需要通过tag跨实例查找,绕远路反而容易出问题。
修复方案
方案1:直接调用刷新逻辑(推荐)
在当前Fragment内定义一个刷新方法,按钮点击时直接执行刷新逻辑,无需重建Fragment:
// 在你的Fragment类中定义刷新方法 private void refreshContent() { // 这里写具体的刷新逻辑:比如重新请求接口、更新RecyclerView数据、刷新UI等 loadData(); // 假设这是你原本加载数据的方法 } // 按钮点击事件 yourRefreshButton.setOnClickListener(v -> refreshContent());
方案2:用当前Fragment实例执行detach/attach
如果一定要通过重新attach的方式刷新,直接使用当前Fragment的this实例,避免null风险:
yourRefreshButton.setOnClickListener(v -> { FragmentTransaction ft = requireActivity().getSupportFragmentManager().beginTransaction(); ft.detach(YourCurrentFragment.this); ft.attach(YourCurrentFragment.this); ft.commit(); });
额外提示
如果你的ViewPager需要保留更多页面实例,可以设置更大的offscreenPageLimit,但不建议设置过大,会占用更多内存:
viewPager.setOffscreenPageLimit(4); // 根据你的需求调整数值
内容的提问来源于stack exchange,提问作者Matrix
相关产品推荐
相关产品推荐

