Vin*_*k B 6 android rotation android-configchanges android-viewpager android-recyclerview
我有一个Activity带ViewPager.在ViewPager有很多的网页,就像一本书.每个片段都有RecyclerViews很多内容.以下是我的用例
1 - 当我滑动页面时,RecyclerView必须从列表的开头开始.2.如果我旋转设备,它应该从旋转之前离开的位置的确切位置读取.
如果我不使用任何逻辑,第二种情况可以完美运行.即旋转.但不是第一种情况.
如果我做一些如下的逻辑.有助于实现第一种情况,但不是第二种情况.
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
if (savedInstanceState==null) {
mIsFirstTime = true;
}
}
@Override
public void onResume() {
super.onResume();
try {
getActivity().invalidateOptionsMenu();
if (!mIsFirstTime) {
mListView.scrollToPosition(0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是
如何确定片段重启是由于屏幕旋转还是Viewpager滑动?
我已经试过了onConfigurationChanged(Configuration newConfig).但它对我没有帮助.请你帮助我好吗
来自OP的评论:
我的问题是我如何知道
onSaveInstanceState()由于屏幕方向更改而不是片段重新启动而被调用
您可以通过Activity#isChangingConfigurations()API 来做到这一点。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (isChangingConfigurations()) {
// this callback is executed as a result of a configuration change (e.g. orientation change)
} else {
// no configuration change happens (e.g. a click on a home button would end up here)
}
}
现在,您可以在重新创建后将布尔值保存到Bundle outState适当的设置 UI 中:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("isConfigurationChange", isChangingConfigurations());
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// initialization logics here
if (savedInstanceState != null) {
boolean isConfigurationChange = savedInstanceState.getBoolean("isConfigurationChange");
// if `onCreate` is called as a result of configuration change
if (isConfigurationChange) {
// view hierarchy is not yet laid out, have to post an action
listView.post(new Runnable() {
@Override
public void run() {
// we are guaranteed, that `listView` is already laid out
listView.scrollToPosition(0);
}
});
}
}
}
请注意,在内部执行布尔值检查逻辑onResume()是一个错误(按主页按钮并导航回应用程序将导致再次滚动到顶部,这是不希望的)。相反,onCreate()应该选择作为正确的回调。
| 归档时间: |
|
| 查看次数: |
296 次 |
| 最近记录: |