我们如何使用无头片段在配置更改中保留简单的状态数组?

时间:2014-04-29 10:40:52

标签: android android-fragments persist

我经历了很多其他类似的问题但没有解决我的问题。 Fragments(显然)的一个用途是坚持一个国家。 我有一个名为arrState的State数组,它包含在一个名为StateFragment的无头片段中。

public class StateFragment extends Fragment {

public static ArrayList<Character> arrState;
protected ActMainGame mActivity = null;
private Character crtX;
public static final String TAG = "StateFragment";

@Override
public void onAttach(Activity activity) {
    Log.d(StateFragment.TAG, "StateFragment: onAttach");
    super.onAttach(activity);
    mActivity = (ActMainGame) activity;
}

@Override
public void onCreate(Bundle b) {
    Log.d(StateFragment.TAG, "StateFragment: onCreate");
    super.onCreate(b);
    setRetainInstance(true);
}

public void setToX() {
arrState = new ArrayList<Character>();
for (int i = 0; i < 9; i++) {
    arrState.add(crtX);
    }
}

我有一个名为ActMainGame的Activity,用Xs填充数组arrState。

public class ActMainGame extends Activity {

// Fragments
private StateFragment mStateFragment = null;
private static final String TAG_FRAGMENT = "state_fragment";


@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d(StateFragment.TAG, "ActMainGame: onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_game);

         // Add Headless Fragment (if not already retained)
    FragmentManager FM = getFragmentManager();
    mStateFragment = (StateFragment) FM.findFragmentByTag(TAG_FRAGMENT); 
        if (mStateFragment == null) {
        Log.d(StateFragment.TAG, "++ Existing fragment not found. ++");
        mStateFragment = new StateFragment();
            FM.beginTransaction().add(mStateFragment, TAG_FRAGMENT).commit();
            } else {
               Log.d(StateFragment.TAG, "++ Existing fragment found. ++");
        }           
}

@Override
public void onStart() {
    super.onStart();
    if (D) Log.d(StateFragment.TAG, "ActMainGame: ON START");

    mStateFragment.setToX();
}

我已经设置了两个类的主要生命周期事件的日志记录。 我期望的是,在进行方向更改时,主要活动会被重建但能够找到片段(包含9个X的状态数组)。果然片段没有被破坏,但活动无法通过这条线找到持久片段:

mStateFragment = (StateFragment) FM.findFragmentByTag(TAG_FRAGMENT); 

因此创建了一个新片段。

以下是调试结果:

++ Existing fragment not found. ++
StateFragment: onAttach
StateFragment: onCreate
ActMainGame: ON START
ActMainGame: onResume
<Orientation change done here>
ActMainGame: onPause
ActMainGame: onStop
StateFragment: onDetach
ActMainGame: onDestroy
ActMainGame: onCreate
++ Existing fragment not found. ++
StateFragment: onAttach
StateFragment: onCreate
ActMainGame: ON START
ActMainGame: onResume

我很清楚还有其他方法来保存状态变量,但我想以“片段方式”来做。

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题!这是Eclipse中的一个主要错误!! 在Eclipse中创建新的Android应用程序项目时,向导允许您从操作栏开始。如果您这样做并选择导航类型&#34; Action Bar Spinner&#34;该向导默认创建以下代码:

@Override
public void onSaveInstanceState(Bundle outState) {
    // Serialize the current dropdown position.
    outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar()
            .getSelectedNavigationIndex());
}

这是一种非常善良的向导,但存在一个巨大的问题!没有超级电话!!代码在大多数情况下都能很好地工作但是如果你想使用SetRetainInstance(true)为你的活动保留一个片段,你需要添加&#34; super&#34;如下所示,或者在您的活动重新创建时不会检测到该片段。

应该是:

@Override
public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
    // Serialize the current dropdown position.
    outState.putInt(STATE_SELECTED_NAVIGATION_ITEM, getActionBar()
            .getSelectedNavigationIndex());
}

希望这可以节省别人花费的时间!