Fragment中的TextView是否需声明为static?遇空指针异常求助
兄弟,我太懂你踩的这个坑了!Fragment的生命周期逻辑和Activity完全不一样,你遇到的空指针跟TextView是不是static半毛钱关系都没有——核心问题肯定是你找控件的时机不对,或者没通过正确的视图对象去查找。咱们拆解一下:
先揪出问题根源
你在Fragment里声明了TextView tv,但如果你的初始化代码(比如tv = findViewById(R.id.xxx))写在了构造函数或者onCreate()里,那必然会空指针!因为Fragment的视图是在onCreateView()阶段才会被inflate出来,这之前根本没有可查找的视图实例,自然找不到控件。
另外,还有一种常见错误:直接用getActivity().findViewById()来查找Fragment里的控件——这也是错的,因为Fragment的布局是独立inflate的,必须通过自己inflate出来的View对象去查找。
正确的实现方式
把你的onCreateView()改成这样,按步骤来:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 先把Fragment的布局inflate成View对象 View fragmentView = inflater.inflate(R.layout.fragment_blank2, container, false); // 必须通过这个fragmentView来查找控件,不能直接调用findViewById tv = fragmentView.findViewById(R.id.your_textview_id); return fragmentView; }
如果需要在后续生命周期里操作这个TextView,比如设置文字,推荐在onViewCreated()里做,这时候视图已经完全创建好了,绝对安全:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 这里放心操作tv就行 tv.setText("终于不崩了!"); }
额外提醒:别碰static!
视频里没把TextView声明成static是完全正确的!要是你为了“解决”空指针把它改成static,反而会引入内存泄漏——static变量会一直持有Fragment的引用,Fragment又持有Activity的引用,导致Activity无法被GC回收,这是Android开发里的大忌!
按照上面的代码改完,你的空指针问题应该就能解决啦~
内容的提问来源于stack exchange,提问作者pawn doe

