片段中的textview是否需要声明为static

时间:2018-04-18 08:48:49

标签: android android-fragments

我最近开始学习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

3 个答案:

答案 0 :(得分:1)

  

当应用程序尝试使用时抛出NullPointerException   具有空值的对象引用。

<强> FYI

  • 您应该返回 VIEW&#39> 对象
  • 检查 findViewById(R.id.txt2 。确保 XML 中存在 ID

<强>唐&#39;吨

tv= (TextView) getActivity().findViewById(R.id.txt2);

<强>不要

 tv= (TextView) view.findViewById(R.id.txt2);

试试这种方式

     @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;
        }

答案 1 :(得分:1)

不是sudo gunzip server.conf.gz -c /etc/openvpn ,它必须是getActivity().findViewById(),因为view.findViewById()会在Activity.findViewById()布局中寻找View,而Activity会看起来对于view.findViewById()布局中的View

Fragment

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View inflatedView = inflater.inflate(R.layout.fragment_blank_fragment2, container, false); return inflatedView; } 中,您可以初始化onViewCreated

TextView

确保@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); }

中的TextView txt2 fragment_blank_fragment2.xml

答案 2 :(得分:0)

对不起,伙计们,这是我身边的一个愚蠢的错误, 在我的主要活动中,我写了

BlankFragment2 frag2 = new BlankFragment2();
    frag2.setName(name);

我通过写

来纠正它
BlankFragment2 frag2=(BlankFragment2)getFragmentManager().findFragmentById(R.id.frag2);
    fragb.setName(name);

现在正在运作