尝试从片段中将文本设置为 activity 中的文本视图时出现 NullPointerException

NullPointerException when trying to set text to a textview in activity from fragment

我在 Activity class:

的顶部创建了这样的变量
private TextView label;

我在 onCreate 方法中像这样分配 textView:

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

    label = (TextView) findViewById(R.id.label);
}

而在 Activity 我有这个功能:

public void changeLabel(String label){
        label.setText(label);
}

然后在附加到 Activity 的片段中,在 onAttach 方法中我这样做:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    ((ParentActivity)activity).changeLabel("New label");
}

但是我在 Activity 的 changeLabel 函数内部得到 NullPointerException,这是错误:

01-15 10:44:43.090  28800-28800/com.app.example E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.app.example, PID: 28800
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app.example/com.app.example.ParentActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2202)
        ...
 Caused by: java.lang.NullPointerException
        at com.app.example.Parentacitvity.changeLabel(Home.java:269)
        at com.app.example.HomeFragment.onAttach(ChildFragment.java:33)
        ...
        at android.app.Activity.onCreate(Activity.java:907)
        at com.app.example.ParentActivity.onCreate(Home.java:68)
        ...

只有当我在应用程序外部完成多个任务后返回到应用程序时才会发生这种情况,所以我认为可能在 Activity 中调用 onCreate 之前片段调用了该函数。有什么建议吗?

片段的 onAttach() 在 activity 的 onCreate() 之前被调用。请改用 onActivityCreated()

当您在 activity 中调用 super.onCreate() 时,片段会恢复,如您的调用堆栈所示。您仅在调用 super.onCreate().

后才初始化 label

作为快速修复,您可以将标签设置推迟到片段生命周期的后期,例如 onActivityCreated()

通常,片段不应该关心它所附加的 activity 的细节。将 activity 转换为特定类型是一种代码味道。考虑重新设计你的方法,让片段只需要关心它自己的 UI 而让包含的 activity 处理它自己的。