Android 片段中的textview是否需要声明为静态
我最近开始学习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
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);