ActionBarActivity后退按钮不会从后台弹出

时间:2014-11-20 01:05:38

标签: android android-fragments android-5.0-lollipop android-actionbaractivity

我使用此模板https://github.com/kanytu/android-material-drawer-template只是为了尝试material design,所以我实施了一些片段,其中有些网页视图有些没有。

我的问题是在片段之间切换时我可以看到它们已成功添加到后台堆栈

getFragmentManager().beginTransaction().replace(R.id.container, new FAQ()).addToBackStack("FAQ").commit();

但是当我按下后退按钮时,它就会关闭应用程序。

当我将其更改为使用Activity而不是ActionBarActivity时,导航工作正常,但我失去了一些其他功能。

后退按钮上有一个覆盖

@Override
public void onBackPressed() {
   if (mNavigationDrawerFragment.isDrawerOpen())
       mNavigationDrawerFragment.closeDrawer();
   else
       super.onBackPressed();
}

但即使将其删除,它仍然会发生。我认为问题出在super.onBackPressed

的某个地方

是否有任何理由ActionBarActivity会破坏后退按钮?

2 个答案:

答案 0 :(得分:21)

我最近看了一篇关于此的帖子,抱歉我找不到了......但基本上,它解释了后退按钮的主要功能是完成当前Activity

事实上,根据the onBackPressed() official documentation

  

当活动检测到用户按下后退键时调用。默认实现只是完成当前活动,但您可以覆盖它以执行任何操作。

看起来即使后面的按钮用于在5.0之前弹出后台堆叠,谷歌也会用新的ActionBarActivity改变这种行为。

就我而言,我使用了一些对我有用的workarround,但这可能对每个人都不起作用,具体取决于你的导航实现。

但如果它对某人有帮助,那么它就是:

@Override
public void onBackPressed()
{
    if (mDrawerLayout.isDrawerOpen()) {
        mDrawerLayout.closeDrawer();
    } else if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

这样,ActionBarActivity.onBackPressed()仅在Backstack为空时调用,在这种情况下它会销毁ActionBarActivity

答案 1 :(得分:1)

你应该检查" getFragmentManager" &安培; " getSupportFragmentManager"符合您的活动&行动主义与否。

因为,在活动中:

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}
FragmentActivity中的

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

我们可以看到已经处理过pop片段backstatck的相同代码。 在我的情况下,我使用了actionbaractivity(扩展FragmentAcvitiy),但我也使用了" getFragmentManager" ,所以我得到了和你一样的错误。我替换了" getFragmentManager"到" getSupportFragmentManager",没关系!你也可以取代" actionbaractiviy"到"活动"解决这个问题。

必须确保" getFragmentManager"匹配"活动"," getSupportFragmentManager"匹配" FragmentActivity(ActionbarActivity)"。

如果您想添加操作栏在API级别11或更高级别,您可以看到:

https://developer.android.com/guide/topics/ui/actionbar.html#Adding

  

在API级别11或更高级别   操作栏包含在使用Theme.Holo主题(或其后代之一)的所有活动中,当targetSdkVersion或minSdkVersion属性设置为" 11"时,这是默认主题。或更高。如果您不想要活动的操作栏,请将活动主题设置为Theme.Holo.NoActionBar。