0

我有一个仅包含一个片段的活动,并且该片段有 2 个继承自 LinearLayout 的对象。我在管理屏幕旋转时遇到了问题,但我通过它们自己的 onRestore 和 onSavedInstance 方法解决了恢复和保存这些对象的状态。但是,当保存片段的活动被破坏时,这无济于事。我该如何进行?

我的活动

public class LifeCounterActivity extends SingleFragmentActivity{
private String[] navMenuTitles;
private TypedArray navMenuIcons;
static String sFragmentTag;
private static String TAG = "LifeCounterActivity";
private static String KEY = "LifeCounterFragement";

LifeCounterFragment mFragment;

public static Intent newIntent(Context packageContext, String fragmentTag){
    Intent intent = new Intent(packageContext,LifeCounterActivity.class);
    intent.putExtra(KEY_ID_FRAGMENT, fragmentTag);
    sFragmentTag = fragmentTag;
    return intent;
}

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    if (savedInstanceState != null){
        mFragment = (LifeCounterFragment) savedInstanceState.getSerializable(KEY);
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,mFragment).commit();
    }else{
        android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = createFragment();
        fm.beginTransaction().add(R.id.fragment_container,fragment).commit();
    }

    /////////////////////////////////////////////////////////////////////////////////
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); // load titles from strings.xml
    navMenuIcons = getResources()
            .obtainTypedArray(R.array.nav_drawer_icons);//load icons from strings.xml
    set(navMenuTitles, navMenuIcons);
    navMenuIcons.recycle();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putSerializable(KEY,mFragment);
    super.onSaveInstanceState(outState);
}

@Override
protected Fragment createFragment() {
    if (mFragment == null){
        mFragment = new LifeCounterFragment();
    }
    return mFragment;
}

}

片段:

    public class LifeCounterFragment extends Fragment implements LifeCounter.EventHistoryRecorder,Serializable{
    public static String TAG = "LifeCounterFragment";
    private static String KEY_PLAYER_1 = "Player1";
    private static String KEY_PLAYER_2 = "Player2";
    private static String KEY_HISTORY = "History";
    LifeCounter mFirstPlayer;
    LifeCounter mSecondPlayer;
    HistoryManager mHistoryManager;

    private static float ROTATION_COUNT = 180f;
    public LifeCounterFragment(){
        setArguments(new Bundle());
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Bundle b = new Bundle();
        b.putSerializable(KEY_HISTORY, mHistoryManager);
        getArguments().putAll(b);
    }



 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_life_counter, container, false);

        savedInstanceState = getArguments();
        if (savedInstanceState != null && savedInstanceState.size() > 0){
            mHistoryManager = (HistoryManager) savedInstanceState.getSerializable(KEY_HISTORY);
            mFirstPlayer = (LifeCounter) savedInstanceState.getSerializable(KEY_PLAYER_1);
            mSecondPlayer = (LifeCounter) savedInstanceState.getSerializable(KEY_PLAYER_2);
        }

        if (mHistoryManager == null) mHistoryManager = new HistoryManager();
        if (mFirstPlayer == null) mFirstPlayer = (LifeCounter) v.findViewById(R.id.player_1_counter);
        if (mSecondPlayer == null) mSecondPlayer = (LifeCounter) v.findViewById(R.id.player_2_counter);

我用来保存和恢复对象的方法

 @Override
public Parcelable onSaveInstanceState()
{
    Bundle bundle = new Bundle();
    bundle.putParcelable("superState", super.onSaveInstanceState());
    bundle.putInt(KEY_LIFE, this.mLife);
    bundle.putString(KEY_NAME, this.mTextViewPlayerName.getText().toString());
    bundle.putInt(KEY_LASTLIFE, this.lastLifeAmount);
    bundle.putSerializable(KEY_LISTENER, (Serializable) mListener);
    bundle.putBoolean(KEY_ASTRAL,this.isAstral);
    return bundle;
}

@Override
public void onRestoreInstanceState(Parcelable state)
{
    if (state instanceof Bundle) // implicit null check
    {
        Bundle bundle = (Bundle) state;
        this.mLife = bundle.getInt(KEY_LIFE); // ... load stuff
        this.lastLifeAmount = bundle.getInt(KEY_LASTLIFE);
        this.mListener = (EventHistoryRecorder) bundle.getSerializable(KEY_LISTENER);
        this.isAstral = bundle.getBoolean(KEY_ASTRAL);
        state = bundle.getParcelable("superState");

        recoverData(bundle.getString(KEY_NAME));
    }
    super.onRestoreInstanceState(state);
}
4

1 回答 1

0

你考虑过使用 SQLight 吗?您可以将对象保存并加载到手机的 sql 中,并在您的活动重新打开时重新加载它们。

如果您想尝试此解决方案,请点击此链接获取 sql 教程:http: //developer.android.com/training/basics/data-storage/databases.html

于 2016-01-28T14:53:56.593 回答