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。只是一个简单的逻辑错误。

相关问题