Android Fragment调用getActivity()、getContext()等方法全部返回null求助
问题根因
你在setImage()方法中重复创建了FiltersListFragment的新实例,这个新实例从未被添加到FragmentManager、也未和Activity完成绑定,因此所有获取Context/Activity的调用都会返回null。
代码逻辑问题点:
setupViewPager()中已经实例化过一个filtersListFragment并添加到ViewPager的适配器中,这个实例才是真正挂载到Activity的有效实例- 但
setImage()中你又写了FiltersListFragment filtersListFragment = new FiltersListFragment();,这个局部变量是完全独立的新实例,没有走Fragment的attach生命周期,自然拿不到宿主Context
修复方案
- 删掉
setImage()中重复创建FiltersListFragment实例的代码,直接调用setupViewPager()中创建的全局成员变量filtersListFragment的prepareThumbnail()方法即可:
private void setImage(){ intent = getIntent(); // 删掉这行重复创建实例的代码:FiltersListFragment filtersListFragment = new FiltersListFragment(); if(intent.hasExtra(getString(R.string.selected_image))){ imgUrl = intent.getStringExtra(getString(R.string.selected_image)); Log.d(TAG, "setImage: got new image url: " + imgUrl); originalImage = ImageManager.getBitmap(imgUrl); filteredImage = originalImage.copy(Bitmap.Config.ARGB_8888, true); finalImage = originalImage.copy(Bitmap.Config.ARGB_8888, true); imagePreview.setImageBitmap(originalImage); // 直接调用全局的已挂载的Fragment实例 filtersListFragment.prepareThumbnail(originalImage); } }
- 附加优化建议:
- 后台线程中操作Fragment之前先调用
isAdded()方法判断Fragment是否已经挂载到Activity,避免空指针:
public void prepareThumbnail(final Bitmap bitmap) { // 先判断是否已挂载,没挂载直接返回 if (!isAdded()) return; // 原有逻辑... }- 避免在Fragment中用全局变量持有Activity/Context引用,防止内存泄漏,所有需要Context的地方优先在
onAttach()生命周期中获取,或者每次调用前判断getActivity() != null再使用。 - 你的
ThumbnailsManager用了静态的列表存数据,注意每次使用前清空,避免内存泄漏和旧数据干扰。
- 后台线程中操作Fragment之前先调用
内容的提问来源于stack exchange,提问作者Krishna Jindal
相关产品推荐
相关产品推荐

