繁体   English   中英

按“后退”按钮时片段无法返回到先前的状态

[英]fragment can not go back to previous state when press Back button

嗨,我有一个遵循以下程序的应用程序: MainActivity使用navigationDrawerfragment之间navigationDrawer ,例如fragment1fragment2fragment3 Fragment1包含tablayout fragment1-A和子fragment1-Bfragment1-C fragment1-B用户单击一个按钮时,他们将转到另一个fragment1-Ba (此事务将添加到backstack)。 当用户在fragment1-Ba按下backButton时。 它们将通过MainActivity这些代码返回fragment1-B

@Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            // if got BackStack, come back to it
            if (fragmentManager.getBackStackEntryCount()>0) {
                super.onBackPressed();

                // if not come to home screen
            }else {
                if (!homeFlag) {
                    fragment = new MainFragment();
                    fragmentManager.popBackStack();
                    fragmentManager.beginTransaction().replace(R.id.contentMainDrawer, fragment).commit();
                    homeFlag = true;
                } else exit();
            }
        }
    }

但是当用户进入fragment1-Ba (第二个tablayout fragment )时,如果他们按BackButton 它给出错误并使应用程序崩溃(在fragment1-BabackButton正常工作)

这是错误。 任何帮助非常感谢。 谢谢。

12-31 12:20:22.118 9719-9719/victory1908.nlbstafflogin2 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: victory1908.nlbstafflogin2, PID: 9719
                                                                          java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
                                                                              at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
                                                                              at java.util.ArrayList.get(ArrayList.java:308)
                                                                              at android.support.design.widget.TabLayout.getTabAt(TabLayout.java:448)
                                                                              at android.support.design.widget.TabLayout$TabLayoutOnPageChangeListener.onPageSelected(TabLayout.java:1759)
                                                                              at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1794)
                                                                              at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:548)
                                                                              at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:514)
                                                                              at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1320)
                                                                              at android.view.View.dispatchRestoreInstanceState(View.java:14564)
                                                                              at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3157)
                                                                              at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3163)
                                                                              at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3163)
                                                                              at android.view.View.restoreHierarchyState(View.java:14542)
                                                                              at android.support.v4.app.Fragment.restoreViewState(Fragment.java:468)
                                                                              at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1094)
                                                                              at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
                                                                              at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:958)
                                                                              at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1666)
                                                                              at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:586)
                                                                              at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:169)
                                                                              at victory1908.nlbstafflogin2.MainActivity.onBackPressed(MainActivity.java:134)
                                                                              at android.app.Activity.onKeyUp(Activity.java:2550)
                                                                              at android.view.KeyEvent.dispatch(KeyEvent.java:3159)
                                                                              at android.app.Activity.dispatchKeyEvent(Activity.java:2805)
                                                                              at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:50)
                                                                              at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:224)
                                                                              at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:50)
                                                                              at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2429)
                                                                              at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4508)
                                                                              at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4463)
                                                                              at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4020)
                                                                              at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4073)
                                                                              at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4039)
                                                                              at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4153)
                                                                              at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4047)
                                                                              at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4210)
                                                                              at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4020)
                                                                              at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4073)
                                                                              at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4039)
                                                                              at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4047)
                                                                              at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4020)
                                                                              at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4073)
                                                                              at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4039)
                                                                              at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4186)
                                                                              at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4347)
                                                                              at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2480)
                                                                              at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2074)
                                                                              at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2065)
                                                                            at android.view.inputmetho
  • 存储片段名称是公共静态变量lastFragment ...
  • 通过设置其先前的片段,在每次移动到新片段时都进行更新。
  • 在主要活动中将其设置为null ...-如果为null,则退出应用程序,否则用lastFragment替换fragmentmanger。

好。 我有你的问题。 这是因为getBackStackEntryCount()返回零。 因此,您需要在提交片段onBackPressed Button之后添加以下行。

fragmentManager.executePendingTransactions();

并添加

fragmentManager(null,FragmentManager.POP_BACK_STACK_INCLUSIVE)代替fragmentManager.popBackStack();

FragmentManager.POP_BACK_STACK_INCLUSIVE )用于弹出整个后堆栈。

查看此讨论

在您的代码中进行编辑:

@Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            // if got BackStack, come back to it
            if (fragmentManager.getBackStackEntryCount()>0) {
                super.onBackPressed();

                // if not come to home screen
            }else {
                if (!homeFlag) {
                    fragment = new MainFragment();
                   fragmentManager(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)// Change
                    fragmentManager.beginTransaction().replace(R.id.contentMainDrawer, fragment).commit();
fragmentManager.executePendingTransactions();// Change
                    homeFlag = true;
                } else exit();
            }
        }
    }

希望对您有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM