2012-12-23 25 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 –