Android 片段空指针异常

Android Fragment Null pointer exception

我正在学习android开发(新手)。我想用textview向mainActivity添加一个片段并更改文本。此代码完美运行:

public class Fragment1 extends Fragment {
//@Nullable
//@Override
TextView textt;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.fragment_fragment1, container, false);
    ((TextView)view.findViewById(R.id.textview)).setText("some text");

    return view;
}

}

但是这段代码调用了空指针异常:

public class Fragment1 extends Fragment {
//@Nullable
//@Override
TextView textt;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.fragment_fragment1, container, false);

    textt =  (TextView)view.findViewById(R.id.textview);
    return view;
}

public void updateText() {
    textt.setText("some text");
}
}

和:

public class Fragment1 extends Fragment {
//@Nullable
//@Override
View view;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view =  inflater.inflate(R.layout.fragment_fragment1, container, false);

    return view;
}

public void updateText() {

    ((TextView)view.findViewById(R.id.textview)).setText("some text");
}
}

主要活动:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment1 frg1 = new Fragment1();
    ft.replace(R.id.fragment_container, frg1);
    ft.addToBackStack(null);
    ft.commit();
    frg1.updateText();
}
}

为什么这些代码提供不同的结果?

my project

这里调用updateText函数的时候并没有创建textview

在您的片段中执行此类调用。不在包含片段的 activity 上。

frg1.updateText(); 在片段的 onCreateView 生命周期方法被调用之前调用。您应该在设置

之后调用该方法

textt = (TextView)view.findViewById(R.id.textview);

 View view =  inflater.inflate(R.layout.fragment_fragment1, container, false);

    textt =  (TextView)view.findViewById(R.id.textview);
    this.updateText();//here
    return view;

查看有关 onCreateView

fragment lifecycle 文档

The system calls this when it's time for the fragment to draw its user interface for the first time.

加载片段时会发生这种情况,而不是在 activity 中创建片段时发生。