如何修复Android官方基础Fragment示例大屏设备上的空指针异常
解决Fragment在大屏平板上的NullPointerException问题
这个空指针问题的核心原因是你错误地通过Activity去查找Fragment内部的视图,而不是用Fragment自己的根视图来定位控件。
为什么平板出问题,手机却正常?
在手机尺寸的屏幕上,ArticleFragment是通过FragmentTransaction动态添加到Activity的容器布局中,此时Fragment的视图会被整合到Activity的视图层级里,getActivity().findViewById(R.id.article)碰巧能找到目标TextView。但在平板的大屏双面板布局中,ArticleFragment是直接嵌入在Activity的布局里的,Fragment的视图属于独立的层级,Activity无法直接查找到Fragment内部的article TextView,因此抛出空指针异常。
修复步骤
正确的做法是让Fragment自己管理和查找内部视图,具体修改如下:
- 在
ArticleFragment中添加成员变量,保存自己的根视图和当前选中的文章位置:
public class ArticleFragment extends Fragment { private View mRootView; private int mCurrentPosition = -1; // 其他原有代码... }
- 修改
onCreateView方法,保存Inflate后的根视图,并且如果有保存的位置,恢复视图状态:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 保存Fragment的根视图 mRootView = inflater.inflate(R.layout.article_view, container, false); // 恢复之前保存的文章位置(比如屏幕旋转后) if (mCurrentPosition != -1) { updateArticleView(mCurrentPosition); } return mRootView; }
- 修改
updateArticleView方法,通过Fragment的根视图查找articleTextView:
public void updateArticleView(int position) { // 用Fragment自己的根视图查找控件,而不是Activity TextView article = (TextView) mRootView.findViewById(R.id.article); article.setText(Ipsum.Articles[position]); mCurrentPosition = position; }
- 可选:添加状态保存,避免屏幕旋转等配置变化后丢失选中状态:
@Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 保存当前选中的文章位置 outState.putInt("current_position", mCurrentPosition); } @Override public void onViewStateRestored(@Nullable Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); if (savedInstanceState != null) { mCurrentPosition = savedInstanceState.getInt("current_position", -1); } }
这样修改后,不管是手机还是平板尺寸的屏幕,Fragment都能正确找到自己内部的TextView,避免空指针异常,同时也符合Fragment的视图管理规范。
内容的提问来源于stack exchange,提问作者Alex Spurling
相关产品推荐
相关产品推荐

