【问题标题】:How to save/restore view states when activity is destroyed android?当活动被破坏android时如何保存/恢复视图状态?
【发布时间】:2015-04-21 08:40:37
【问题描述】:

当活动被销毁并重新打开时,恢复微调器状态、在 textViews 中输入的文本等的最佳方法是什么?

编辑: 这是我的一些代码,当再次调用 onCreate 时,如何使在 writeText 中输入的任何文本都存在?

SharedPreferences sh_Pref;
SharedPreferences.Editor toEdit;

    @Override
public void onDestroy() {
    sharedPrefernces();
    super.onDestroy();
}

    public void sharedPrefernces() {

    sh_Pref = getSharedPreferences("SavedConfig", MODE_PRIVATE);
    toEdit = sh_Pref.edit();
    toEdit.putString("Text", writeText.getText().toString());
    toEdit.commit();

}

【问题讨论】:

  • 将状态保存在 SharedPreferences 中,然后在重新启动时在您的活动的 onCreate 中获取它们
  • 好的,我是 android 新手,我如何在 OnCreate 中获取 SharedPreferences?
  • 请参阅上面的编辑...

标签: android android-activity io spinner


【解决方案1】:

我尝试了很多东西,但这是我发现并多次使用的最佳方法。通过示例显示清楚的东西,在this Post 中很好地解释了

public class MainFragment extends StatedFragment {

...

/**
 * Save Fragment's State here
 */
@Override
protected void onSaveState(Bundle outState) {
    super.onSaveState(outState);
    // For example:
    //outState.putString("text", tvSample.getText().toString());
}

/**
 * Restore Fragment's State here
 */
@Override
protected void onRestoreState(Bundle savedInstanceState) {
    super.onRestoreState(savedInstanceState);
    // For example:
    //tvSample.setText(savedInstanceState.getString("text"));
}

...

}

还提供片段模板以便更好地理解

   import android.os.Bundle;
   import android.support.v4.app.Fragment;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.ViewGroup;

   import com.inthecheesefactory.thecheeselibrary.R;

   /**
   * Created by nuuneoi on 11/16/2014.
   */
public class StatedFragment extends Fragment {

Bundle savedState;

public StatedFragment() {
    super();
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // Restore State Here
    if (!restoreStateFromArguments()) {
        // First Time, Initialize something here
        onFirstTimeLaunched();
    }
}

protected void onFirstTimeLaunched() {

}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // Save State Here
    saveStateToArguments();
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    // Save State Here
    saveStateToArguments();
}

////////////////////
// Don't Touch !!
////////////////////

private void saveStateToArguments() {
    if (getView() != null)
        savedState = saveState();
    if (savedState != null) {
        Bundle b = getArguments();
        b.putBundle("internalSavedViewState8954201239547", savedState);
    }
}

////////////////////
// Don't Touch !!
////////////////////

private boolean restoreStateFromArguments() {
    Bundle b = getArguments();
    savedState = b.getBundle("internalSavedViewState8954201239547");
    if (savedState != null) {
        restoreState();
        return true;
    }
    return false;
}

/////////////////////////////////
// Restore Instance State Here
/////////////////////////////////

private void restoreState() {
    if (savedState != null) {
        // For Example
        //tv1.setText(savedState.getString("text"));
        onRestoreState(savedState);
    }
}

protected void onRestoreState(Bundle savedInstanceState) {

}

//////////////////////////////
// Save Instance State Here
//////////////////////////////

private Bundle saveState() {
    Bundle state = new Bundle();
    // For Example
    //state.putString("text", tv1.getText().toString());
    onSaveState(state);
    return state;
}

protected void onSaveState(Bundle outState) {

}
}

【讨论】:

  • 谢谢,但我的应用使用的是活动而不是片段
  • 没问题,你也可以在活动中使用它
  • onSavedInstanceState() 在 Activity 被销毁时不会被调用,只有在其暂停时才会调用
【解决方案2】:

如果您为您的 textView 设置一个唯一标识符,则 acivity 将自动保存该元素的状态。出于其他目的,您应该覆盖onSavedInstanceState() 方法

【讨论】:

  • 活动销毁时不调用onSavedInstanceState()方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多