我试图在方向更改中保存数据.如下面的代码所示,我使用onSaveInstanceState()和onRestoreInstanceState().我尝试获取保存的值,然后检查它是否是正确的值onRestoreInstanceState().但是当我尝试使用新值时onCreate(),我没有新值,而是旧值.
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("TEXT", user);
}
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
savedUser = savedInstanceState.getString("TEXT");
Log.d("enregistred value", savedUser);
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int display_mode = getResources().getConfiguration().orientation;
if (display_mode == 1) {
setContentView(R.layout.main_grid);
mGrid = (GridView) findViewById(R.id.gridview);
mGrid.setColumnWidth(95);
mGrid.setVisibility(0x00000000);
// mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
} else {
setContentView(R.layout.main_grid_land);
mGrid = (GridView) findViewById(R.id.gridview);
mGrid.setColumnWidth(95);
Log.d("Mode", "land");
// mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
Log.d("savedUser", savedUser);
if (savedUser.equals("admin")) { //value 0
adapter.setApps(appManager.getApplications());
} else if (savedUser.equals("prof")) { //value 1
adapter.setApps(appManager.getTeacherApplications());
} else {// default value
appManager = new ApplicationManager(this, getPackageManager());
appManager.loadApplications(true);
bindApplications();
}
}
Run Code Online (Sandbox Code Playgroud)
Arv*_*vis 46
在先前销毁活动之后重新创建活动时,您可以从系统传递活动的Bundle中恢复已保存的状态.onCreate()和onRestoreInstanceState()回调方法都接收包含实例状态信息的相同Bundle.
因为无论系统是创建活动的新实例还是重新创建前一个实例,都会调用onCreate()方法,因此在尝试读取之前必须检查状态Bundle是否为null.如果它为null,则系统正在创建活动的新实例,而不是恢复已销毁的先前实例.
static final String STATE_USER = "user";
private String mUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mUser = savedInstanceState.getString(STATE_USER);
} else {
// Probably initialize members with default values for a new instance
mUser = "NewUser";
}
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putString(STATE_USER, mUser);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
Shr*_*ari 18
onSaveInstanceState() 是一种用于在暂停活动之前存储数据的方法.描述: Hook允许视图生成其内部状态的表示,以后可用于创建具有相同状态的新实例.此状态应仅包含不持久或以后无法重建的信息.例如,您永远不会将当前位置存储在屏幕上,因为当视图的新实例放置在其视图层次结构中时,将再次计算该位置.
onRestoreInstanceState() 是用于检索该数据的方法.描述:当从以前保存的状态重新初始化活动时,在onStart()之后调用此方法,此处在savedInstanceState中给出.大多数实现只是使用onCreate(Bundle)来恢复它们的状态,但是在完成所有初始化之后有时可以方便地执行此操作,或者允许子类决定是否使用默认实现.此方法的默认实现执行先前已被onSaveInstanceState(Bundle)冻结的任何视图状态的恢复.
在这里考虑这个例子:
你的应用程序有3个编辑框,用户输入了一些信息,但他接到一个电话,所以如果你没有使用上述方法,他输入的内容将会丢失.
所以总是将当前数据保存在onPause()Activity的方法中作为bundle并在onResume()方法中调用该onRestoreInstanceState()方法.
请参阅 :
http://www.how-to-develop-android-apps.com/tag/onrestoreinstancestate/
小智 9
发生这种情况是因为您savedValue在onCreate()方法中使用了它.将savedValue在更新onRestoreInstanceState()的方法,但onRestoreInstanceState()在后调用onCreate()方法.你可以:
savedValuein onCreate()方法,或savedValuein onRestoreInstanceState()方法的代码.但我建议你使用第一种方法,使代码如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int display_mode = getResources().getConfiguration().orientation;
if (display_mode == 1) {
setContentView(R.layout.main_grid);
mGrid = (GridView) findViewById(R.id.gridview);
mGrid.setColumnWidth(95);
mGrid.setVisibility(0x00000000);
// mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
} else {
setContentView(R.layout.main_grid_land);
mGrid = (GridView) findViewById(R.id.gridview);
mGrid.setColumnWidth(95);
Log.d("Mode", "land");
// mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
if (savedInstanceState != null) {
savedUser = savedInstanceState.getString("TEXT");
} else {
savedUser = ""
}
Log.d("savedUser", savedUser);
if (savedUser.equals("admin")) { //value 0
adapter.setApps(appManager.getApplications());
} else if (savedUser.equals("prof")) { //value 1
adapter.setApps(appManager.getTeacherApplications());
} else {// default value
appManager = new ApplicationManager(this, getPackageManager());
appManager.loadApplications(true);
bindApplications();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
104199 次 |
| 最近记录: |