我在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之前片段调用该函数。有什么建议吗?
答案 0 :(得分:3)
当您在活动中调用super.onCreate()
时,片段会恢复,如调用堆栈中所示。您只有在致电label
后才会初始化super.onCreate()
。
作为快速解决方法,您可以将标签设置推迟到片段生命周期的后期,例如onActivityCreated()
。
通常,片段不应该关心它所附着的活动的细节。将活动转换为特定类型是代码气味。考虑重新设计您的方法,以便片段只需要考虑自己的UI,并让包含的活动自己处理。
答案 1 :(得分:0)
在活动onAttach()
之前调用片段onCreate()
。请改用onActivityCreated()
。