我在主應用程序活動中遇到了一個奇怪的錯誤。在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));
}
當應用程序崩潰時,您得到的錯誤是什麼?請在這裏發佈它的整個logcat。 – Vucko
現在就發佈。我得到的錯誤是由於嘗試調用MoistureFragment對象上的方法,該對象爲null,這是由於未調用instantiateItem()方法造成的。當instantiateItem被調用時,我不會得到這個錯誤。 –