我经历了很多其他类似的问题但没有解决我的问题。 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
我很清楚还有其他方法来保存状态变量,但我想以“片段方式”来做。
答案 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());
}
希望这可以节省别人花费的时间!