尝试将文本设置为片段活动中的textview时出现NullPointerException

时间:2015-01-15 15:51:25

标签: java android android-fragments nullpointerexception

我在Activity类的顶部创建了这样的变量:

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

在活动中我有这个功能:

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里面得到NullPointerException,在changeLabel函数里面,这里是错误:

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)
        ...

这只发生在我在其外面执行多个任务后回到应用程序时,所以我想可能在调用onCreate之前片段调用该函数。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

当您在活动中调用super.onCreate()时,片段会恢复,如调用堆栈中所示。您只有在致电label后才会初始化super.onCreate()

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

通常,片段不应该关心它所附着的活动的细节。将活动转换为特定类型是代码气味。考虑重新设计您的方法,以便片段只需要考虑自己的UI,并让包含的活动自己处理。

答案 1 :(得分:0)

在活动onAttach()之前调用片段onCreate()。请改用onActivityCreated()