2012-12-23 28 views
1

由於某些原因,gridView中的值不會從Bundle中保存。什麼也沒有被輸出到logcat。我是否正確地從gridview中獲取值?這是充滿了編輯文本的,所以應該從那裏值不會保存在savedInstanceState中

public class RedScorerFragment extends SherlockFragment { 

LayoutInflater infl; 
GridView mGrid; 

int R1C1, R1C2, R1C3; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    infl = inflater; 
    View mView = inflater.inflate(R.layout.fragment_score_red, container, false); 
    mGrid = (GridView) mView.findViewById(R.id.gridViewRed); 


    if(savedInstanceState != null) 
    { 
     R1C1 = savedInstanceState.getInt("R1C1"); 
     R1C2 = savedInstanceState.getInt("R1C2"); 
     R1C3 = savedInstanceState.getInt("R1C3"); 

     Log.d("savedd R1C1 ", String.valueOf(R1C1)); 
     Log.d("savedd R1C2 ", String.valueOf(R1C2)); 
     Log.d("savedd R1C3 ", String.valueOf(R1C3)); 
    } 


    mGrid.setAdapter(new ImageAdapter(getActivity())); 
    return mView; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState){ 
    super.onActivityCreated(savedInstanceState); 

    if(savedInstanceState != null) 
    { 
     R1C1 = savedInstanceState.getInt("R1C1", 0); 
     R1C2 = savedInstanceState.getInt("R1C2", 0); 
     R1C3 = savedInstanceState.getInt("R1C3", 0); 

     Log.v("saved R1C1 ", String.valueOf(R1C1)); 
     Log.v("saved R1C2 ", String.valueOf(R1C2)); 
     Log.v("saved R1C3 ", String.valueOf(R1C3)); 
    } 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState){ 
    super.onSaveInstanceState(savedInstanceState); 

    //for(int i=0;i<mGrid.getChildCount(); i++) 
    Log.e("Saving", mGrid.getChildAt(0).toString()); 
    Log.e("Saving", mGrid.getChildAt(1).toString()); 
    Log.e("Saving", mGrid.getChildAt(2).toString()); 
    savedInstanceState.putInt("R1C1", Integer.valueOf(mGrid.getItemAtPosition(0).toString())); 
    savedInstanceState.putInt("R1C2", Integer.valueOf(mGrid.getItemAtPosition(1).toString())); 
    savedInstanceState.putInt("R1C3", Integer.valueOf(mGrid.getItemAtPosition(2).toString())); 

} 

} 

的logcat的是越來越值

12-22 23:58:38.736: E/AndroidRuntime(2481): FATAL EXCEPTION: main 
12-22 23:58:38.736: E/AndroidRuntime(2481): java.lang.RuntimeException: Unable to pause activity {org.say.upscorer/org.say.upscorer.MainActivity}: java.lang.NullPointerException 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3348) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3305) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3288) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.ActivityThread.access$2500(ActivityThread.java:125) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2040) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.os.Looper.loop(Looper.java:123) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at dalvik.system.NativeStart.main(Native Method) 
12-22 23:58:38.736: E/AndroidRuntime(2481): Caused by: java.lang.NullPointerException 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at org.saywatt.scoring.RedScorerFragment.onSaveInstanceState(RedScorerFragment.java:91) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.support.v4.app.Fragment.performSaveInstanceState(Fragment.java:1607) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1587) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1655) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:527) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at com.actionbarsherlock.app.SherlockFragmentActivity.onSaveInstanceState(SherlockFragmentActivity.java:127) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.Activity.performSaveInstanceState(Activity.java:1036) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1180) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3330) 
12-22 23:58:38.736: E/AndroidRuntime(2481):  ... 12 more 

回答

0

Bundle::get系列函數採取標籤ID作爲參數。這就是他們如何知道你到底在問什麼。即,

// get a String with id "R1C1", note the quotes 
R1C1 = savedInstanceState.getString("R1C1"); 

你呼喚他們這只是偶然,因爲你面對的Strings的工作方式,卻是實實在在的一個StringID無論R1C1包含在那個時候。

但是您要將ints放在包上,並期望提取Strings,這是一個簡單而簡單的錯誤。

+0

它仍然沒有工作 – rasen58

+0

我更新的代碼在後使用整數,它仍然在logcat的 – rasen58

+0

顯示@ rasen58:​​你做的注意,'onSaveInstanceState'您登錄一件事但保存另一個,對嗎? –

0

如何在您的清單中聲明父Activity?如果你正在處理配置的變化,即

android:configChanges= whatever 

Activity,因此您的Fragment將不會被重建。

+0

哦,我沒有任何配置更改 rasen58

+0

這就是應用程序的聲明。你可以發佈你有什麼活動? –

+0

'<活動 機器人:名稱= 「org.say.upscorer.MainActivity」 機器人:標籤= 「@串/ APP_NAME」 機器人:windowSoftInputMode = 「stateAlwaysHidden | adjustResize」 > <意圖濾波器> <動作android:name =「android.intent.action.MAIN」/> ' – rasen58

0

你可能是自動(聯合)拳擊的另一個受害者。我懷疑由於Bundle.putInt()需要int作爲第二個參數,而您提供的值爲Integer.valueOf(),它將返回Integer。如果返回Integer不是null,但是拆箱將無法將null轉換爲普通int並導致NPE。

如何處理特定情況並取決於應用程序的功能。無論如何,請確保Integer.valueOf()不返回null

0

如果要設置

setRetainInstance(true) 

您的片段內或從活動設置它:

myFragment.setRetainInstance(true): 

則包從onSaveInstanceState()傳遞給onCreate()onCreateView()將是無效的,即使你加額外在onSaveInstanceState()

看到這個答案:how i can break things with Fragments with setRetainInstance(true) and adding them to backstack?

+0

我沒有'setRetainInstance(true)'在任何地方。我需要它嗎? – rasen58

+0

我之所以提到它,是因爲它與在片段中使用onSaveInstanceState()不兼容,並且在您將其稱爲某處可能導致您所描述的問題的地方。如果使用onSaveInstanceState傳遞一個包,那麼不要使用setInstanceState()。如果你想更多地瞭解它的作用,請看這裏:http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean –