0

我在主應用程序活動中遇到了一個奇怪的錯誤。在Bundle中添加額外的內容會導致奇怪的衝突和應用程序崩潰...爲什麼?

我在我的活動中有一個FragmentStatePagerAdapter(作爲內部類),其instantiateItem(ViewGroup container, int position)方法被重寫以處理方向更改。

這種方法工作得很好,直到我通過onSaveInstanceState(Bundle outState)把一個字符串放在一個包中。當方法像這樣實現的,instantiateItem不叫:

@Override 
protected void onSaveInstanceState(Bundle outState){ 
    if (myObject != null) { 
     outState.putString(MY_OBJECT_KEY, myObject.getName()); 
    } 
    super.onSaveInstanceState(outState); 
} 

當我刪除outState.putString(MY_OBJECT_KEY, myObject.getName()) instantiateItem被稱爲沒有問題每次方向改變。爲什麼是這樣?任何幫助是真正的讚賞。

的錯誤,我得到的是這樣的:

E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.android.miki.rpiplantsapp, PID: 22292          
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.miki.rpiplantsapp/com.android.miki.rpiplantsapp.PlantStatsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.miki.rpiplantsapp.MoistureFragment.setOptimalStatText(java.lang.String)' on a null object reference 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077) 
     at android.app.ActivityThread.-wrap15(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5422) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.android.miki.rpiplantsapp.MoistureFragment.setOptimalStatText(java.lang.String)' on a null object reference 
     at com.android.miki.rpiplantsapp.PlantStatsActivity$ViewPageAdapter.updateCurrentFragsOptimal(PlantStatsActivity.java:733) 
     at com.android.miki.rpiplantsapp.PlantStatsActivity.loadPlantItemTabs(PlantStatsActivity.java:426) 
     at com.android.miki.rpiplantsapp.PlantStatsActivity.onCreate(PlantStatsActivity.java:225) 
     at android.app.Activity.performCreate(Activity.java:6251) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)  
     at android.app.ActivityThread.-wrap15(ActivityThread.java)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:148)  
     at android.app.ActivityThread.main(ActivityThread.java:5422)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

instantiateItem方法是這樣的:

@Override 
    public Object instantiateItem(ViewGroup container, int position){ 
     switch (position){ 
      case 0: 
       MoistureFragment moistureTab = (MoistureFragment) super.instantiateItem(container, position); 
       currentMoistureFragment = moistureTab; 
       return currentMoistureFragment; 

      case 1: 
       LightFragment lightTab = (LightFragment) super.instantiateItem(container, position); 
       currentLightFragment = lightTab; 
       return currentLightFragment; 
      case 2: 
       TemperatureFragment tempTab = (TemperatureFragment) super.instantiateItem(container, position); 
       currentTempFragment = tempTab; 
       return currentTempFragment; 
      default: 
       return null; 
     } 
    } 

updateCurrentFragsOptimal()看起來是這樣的:

public void updateCurrentFragsOptimal(double moistureValue, double lightValue, double tempValue){ 
     currentMoistureFragment.setOptimalStatText(String.valueOf(moistureValue)); 
     currentLightFragment.setOptimalStatText(String.valueOf(lightValue)); 
     currentTempFragment.setOptimalStatText(String.valueOf(tempValue)); 
    } 
+0

當應用程序崩潰時,您得到的錯誤是什麼?請在這裏發佈它的整個logcat。 – Vucko

+0

現在就發佈。我得到的錯誤是由於嘗試調用MoistureFragment對象上的方法,該對象爲null,這是由於未調用instantiateItem()方法造成的。當instantiateItem被調用時,我不會得到這個錯誤。 –

回答

0

雖然壓倒一切的onSaveInstanceState ()你應該在你之前調用超類代碼。

@Override 
protected void onSaveInstanceState(Bundle outState){ 
    super.onSaveInstanceState(outState); 
    if (myObject != null && outState != null) { 
     outState.putString(MY_OBJECT_KEY, myObject.getName()); 
    } 
} 
+0

剛剛嘗試過。不幸的是無法工作。 instantiateItem仍然沒有被調用。 –

1

嗯,這是比我想象的......我想通了,我在onCreate()方法中調用的方法,當savedInstanceState是不爲空,調用其他方法更簡單。這種方法做了幾件事阻止instantiateItem被調用,因此一個片段結束爲空,並導致NullPointerException。只是一個簡單的邏輯錯誤。

相關問題