13

我正在使用这个模板https://github.com/kanytu/android-material-drawer-template只是为了尝试,material design所以我实现了一些片段,有些片段有 webviews,有些没有。

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

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会破坏后退按钮吗?

4

2 回答 2

21

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

事实上,根据官方onBackPressed()文档

当活动检测到用户按下返回键时调用。默认实现只是完成当前活动,但您可以覆盖它来做任何您想做的事情。

并且看起来即使在 5.0 之前用于弹出 backstack 的后退按钮,Google 也会使用新的ActionBarActivity.

就我而言,我使用了一些对我有用的工作方法,但可能不适用于所有人,具体取决于您的导航实现。

但如果它可能对某人有帮助,这里是:

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

这种方式,ActionBarActivity.onBackPressed()仅在 backstack 为空时调用,在这种情况下,它会破坏ActionBarActivity.

于 2014-11-20T11:53:51.047 回答
1

您应该检查“getFragmentManager”和“getSupportFragmentManager”是否与您的活动和操作栏活动匹配。

因为,在活动中:

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

在片段活动中:

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

我们可以看到已经处理 pop 片段 backstatck 的相同代码。在我的情况下,我使用了 actionbaractivity(extends FragmentAcvitiy),但我也使用了 "getFragmentManager" ,所以我得到了和你一样的错误。在我将“getFragmentManager”替换为“getSupportFragmentManager”之后,没关系!您也可以将“actionbaractiviy”替换为“Activity”来解决此问题。

必须确保“getFragmentManager”匹配“Activity”,“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。

于 2014-12-04T04:02:05.793 回答