[英]fragment can not go back to previous state when press Back button
Hi I have a app that follow as follow: MainActivity
use navigationDrawer
to navigate between fragment
for example fragment1
, fragment2
, fragment3
. 嗨,我有一个遵循以下程序的应用程序: MainActivity
使用navigationDrawer
在fragment
之间navigationDrawer
,例如fragment1
, fragment2
, fragment3
。 Fragment1
Contain tablayout
fragment1-A
and child fragment1-B
and fragment1-C
. Fragment1
包含tablayout
fragment1-A
和子fragment1-B
和fragment1-C
。 when user in fragment1-B
click a button, they will go to another fragment1-Ba
(this transaction will be add to backstack). 当fragment1-B
用户单击一个按钮时,他们将转到另一个fragment1-Ba
(此事务将添加到backstack)。 When user press backButton
in fragment1-Ba
. 当用户在fragment1-Ba
按下backButton
时。 They will go back to fragment1-B
by these code in the MainActivity
. 它们将通过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();
}
}
}
But when user inside fragment1-Ba
(2nd tablayout
fragment
) if they press BackButton
. 但是当用户进入fragment1-Ba
(第二个tablayout
fragment
)时,如果他们按BackButton
。 It give the error and crash the app (inside fragment1-Ba
press backButton
work normally) 它给出错误并使应用程序崩溃(在fragment1-Ba
按backButton
正常工作)
this is the error. 这是错误。 Anyhelp is much appreciate. 任何帮助非常感谢。 Thanks. 谢谢。
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
Ok. 好。 I got your problem. 我有你的问题。 This is because getBackStackEntryCount()
is returning Zero. 这是因为getBackStackEntryCount()
返回零。 So you need to add below lines after committing your fragment onBackPressed
Button. 因此,您需要在提交片段onBackPressed
Button之后添加以下行。
fragmentManager.executePendingTransactions();
and add 并添加
fragmentManager(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) instead of fragmentManager.popBackStack(); fragmentManager(null,FragmentManager.POP_BACK_STACK_INCLUSIVE)代替fragmentManager.popBackStack();
FragmentManager.POP_BACK_STACK_INCLUSIVE
) is usedto pop the entire back stack. FragmentManager.POP_BACK_STACK_INCLUSIVE
)用于弹出整个后堆栈。
See this discussion 查看此讨论
Editing in your code : 在您的代码中进行编辑:
@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();
}
}
}
Hope it help you. 希望对您有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.