我在主应用程序活动中遇到了一个奇怪的错误。在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被调用时,我不会得到这个错误。 –