确定片段重启是否是由于屏幕旋转或Viewpager滑动造成的?

Vin*_*k B 6 android rotation android-configchanges android-viewpager android-recyclerview

我有一个ActivityViewPager.在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).但它对我没有帮助.请你帮助我好吗

azi*_*ian 2

来自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()应该选择作为正确的回调。