2015-01-15 71 views
0

設置文本到在活動一個TextView我在Activity類的頂部創建這樣的變量時:的NullPointerException試圖從片段

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

那麼是誰連接到活動,onAttach方法裏面我這樣做:

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

但即時得到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) 
     ... 

這隻happenning當我在完成多個任務之後回到應用程序,所以我認爲在Activity中調用onCreate之前,該函數可能會被fragment調用。任何建議?

回答

3

當您在活動中調用super.onCreate()時,片段得到恢復,如調用堆棧中所示。您只有在致電super.onCreate()後才初始化label

作爲一種快速解決方案,您可以將標籤設置推遲到片段生命週期的後期,例如onActivityCreated()

一般來說,片段不應該關心它所附加的活動的細節。將活動投射到特定類型是一種代碼異味。考慮重新設計你的方法,以便片段只需要介意自己的UI並讓包含的活動自己處理。

0

在活動的onCreate()之前調用片段的onAttach()。改爲使用onActivityCreated()

相關問題