如何在方向更改期间保留列表视图的状态?
how to retain state of listview during orientation changes?
大家好,我知道在阅读我的问题标题后,您会发现回答起来非常简单,但由于我是 android 开发的新手,所以我发现很难在方向更改期间保持列表视图的状态,甚至关于片段状态,我在 google 上浏览了很多,但我没有找到在方向更改期间保留状态的任何令人满意的解决方案,我知道它们是一种 onsaveinstancestate() 方法,您必须在其中放置每个视图数据,但我认为它们是一个更好的解决方案,所以请帮助我找到解决方案。您还可以提供 link 方向改变的好教程。
提前致谢
我注意到,根据您的实现,默认情况下会保存列表视图状态,但要恢复状态,请重新创建列表视图并确保使用 savedInstanceState
作为超级方法之一参数在之后(而不是之前)调用。为什么?由于列表视图状态已保存,super 方法会恢复它,如果您在调用 super 后重新创建,则会覆盖恢复的状态。
另一种方法是覆盖activity的onSaveInstanceState(outState)
,将listview状态放在bundle中,
outState.putParcelable("listview.state", listview.onSaveInstanceState());
然后当您覆盖 onRestoreInstanceState(savedInstanceState)
时,在重新创建列表视图后调用;
Parcelable listViewState = savedInstanceState.getParcelable("listview.state");
listview.onRestoreInstanceState(listViewState);
检查空值,祝你好运!
你可以使用setRetainInstance(true);在片段
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
dataFragment = (RetainedFragment) fm.findFragmentByTag(“data”);
// create the fragment and data the first time
if (dataFragment == null) {
// add the fragment
dataFragment = new DataFragment();
fm.beginTransaction().add(dataFragment, “data”).commit();
// load the data from the web
}
// the data is available in dataFragment.getData()
...
}
}
在片段中创建您的列表视图 - 片段将是 -
public class RetainedFragment extends Fragment {
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
// retain this fragment
setRetainInstance(true);
// create your listview here
}
}
我会通过将此行添加到清单中来保留整个 Activity 的状态,作为 Activity 标签内的 属性:
android:configChanges="keyboardHidden|orientation|screenSize"
大家好,我知道在阅读我的问题标题后,您会发现回答起来非常简单,但由于我是 android 开发的新手,所以我发现很难在方向更改期间保持列表视图的状态,甚至关于片段状态,我在 google 上浏览了很多,但我没有找到在方向更改期间保留状态的任何令人满意的解决方案,我知道它们是一种 onsaveinstancestate() 方法,您必须在其中放置每个视图数据,但我认为它们是一个更好的解决方案,所以请帮助我找到解决方案。您还可以提供 link 方向改变的好教程。 提前致谢
我注意到,根据您的实现,默认情况下会保存列表视图状态,但要恢复状态,请重新创建列表视图并确保使用
savedInstanceState
作为超级方法之一参数在之后(而不是之前)调用。为什么?由于列表视图状态已保存,super 方法会恢复它,如果您在调用 super 后重新创建,则会覆盖恢复的状态。另一种方法是覆盖activity的
onSaveInstanceState(outState)
,将listview状态放在bundle中,outState.putParcelable("listview.state", listview.onSaveInstanceState());
然后当您覆盖
onRestoreInstanceState(savedInstanceState)
时,在重新创建列表视图后调用;Parcelable listViewState = savedInstanceState.getParcelable("listview.state"); listview.onRestoreInstanceState(listViewState);
检查空值,祝你好运!
你可以使用setRetainInstance(true);在片段
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// find the retained fragment on activity restarts
FragmentManager fm = getFragmentManager();
dataFragment = (RetainedFragment) fm.findFragmentByTag(“data”);
// create the fragment and data the first time
if (dataFragment == null) {
// add the fragment
dataFragment = new DataFragment();
fm.beginTransaction().add(dataFragment, “data”).commit();
// load the data from the web
}
// the data is available in dataFragment.getData()
...
}
}
在片段中创建您的列表视图 - 片段将是 -
public class RetainedFragment extends Fragment {
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");
// retain this fragment
setRetainInstance(true);
// create your listview here
}
}
我会通过将此行添加到清单中来保留整个 Activity 的状态,作为 Activity 标签内的 属性:
android:configChanges="keyboardHidden|orientation|screenSize"