Android 片段中的textview是否需要声明为静态

Android 片段中的textview是否需要声明为静态,android,android-fragments,Android,Android Fragments,我最近开始学习android,我在视频教程中看到了一个片段示例 在本教程中,他们没有将textview设置为静态,但当我尝试在代码中进行一些更改以实现片段时,我开始出现空指针异常,我的代码如下所示 public class BlankFragment2 extends Fragment { TextView tv; public BlankFragment2() { // Required empty public constructor } @Override public V

我最近开始学习android,我在视频教程中看到了一个片段示例 在本教程中,他们没有将textview设置为静态,但当我尝试在代码中进行一些更改以实现片段时,我开始出现空指针异常,我的代码如下所示

public class BlankFragment2 extends Fragment {

TextView tv;

public BlankFragment2() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_blank_fragment2, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    tv= (TextView) getActivity().findViewById(R.id.txt2);
}



public void setName(String name){
    //tv=(TextView)getActivity().findViewById(R.id.txt2);
    if(tv == null){
        System.out.println("tv is null");
    }
    tv.setText("Hi "+name);
}
}
我在settext遇到空指针异常,除非我将textview设置为静态。有人能解释一下原因吗

这不是什么NPE的重复我知道什么是NPE以及为什么它会出现我的问题是,在onActivityCreated中初始化textview后,为什么它在setname函数中再次为null

当应用程序尝试使用 具有空值的对象引用

供参考

您应该返回视图的对象 检查findviewbydr.id.txt2。确保此ID以XML形式存在。 不要

这样试试

     @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
             View view= inflater.inflate(R.layout.fragment_blank_fragment2, container, false);
             tv= (TextView) view.findViewById(R.id.txt2);
            return view;
        }
不是getActivity.findViewById,它必须是view.findViewById,因为Activity.findViewById将在活动布局中查找视图,而view.findViewById将在片段布局中查找视图

在onViewCreated中,您可以初始化文本视图


确保你有一个id为txt2的文本视图,它位于fragment\u blank\u fragment2.xml中, 在我的主要活动中,我写道

BlankFragment2 frag2 = new BlankFragment2();
    frag2.setName(name);
我通过写作纠正了它

BlankFragment2 frag2=(BlankFragment2)getFragmentManager().findFragmentById(R.id.frag2);
    fragb.setName(name);

现在它正在工作

没有。在哪个布局中存在R.id.txt2?在片段_空白中_fragment2@ADM这绝对不是NPE的复制品我知道为什么NPE会出现,我更新了问题,以更好地解释问题。这没有任何区别,最终你访问的是一个空对象,它会给你NPE。根本原因是getActivity指向父活动,而您的视图是片段而不是活动的一部分。@ADM我还尝试了view view=getView;然后view.findViewByIdR.id.txt2仍在获取NPEWhat’s house out?`getActivity.findViewById`将在活动布局中搜索该id。这也给了NPE确保R.id.txt2存在于R.layout.fragment\u blank\u fragment2你应该把它放在你的答案中,这就是我的意思。。。希望你会喜欢我的编辑;好答案!我试过了,这也给NPE出了什么问题?@pawndoe check findviewbydr.id.txt2。Id tx2是否有效?@pawndoe在更改后清理重建并运行该操作,仍然让NPEGlad看到您修复了该问题。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View inflatedView = inflater.inflate(R.layout.fragment_blank_fragment2, container, false);
    return inflatedView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // here goes your intialisation using view
    tv= (TextView) view.findViewById(R.id.txt2);
}
BlankFragment2 frag2 = new BlankFragment2();
    frag2.setName(name);
BlankFragment2 frag2=(BlankFragment2)getFragmentManager().findFragmentById(R.id.frag2);
    fragb.setName(name);