在 ActionBar 中使用 UP 插入符号从 Activity 转到 Fragment - Android 4.0+

Use UP caret in ActionBar to go from Activity to Fragment - Android 4.0+

我一直在研究所有 day/night 的解决方案,但似乎有很多选择可以从 ActivityFragment,但是 none 在 S.O 为我工作。实际上,我在 Activity 中,我想在 ActionBar 中使用我的应用程序徽标来单击它,然后 return 到 Fragment。这个 Fragment 是我的 Activity 的 "parent class",这意味着我单击 Fragment 中的一个按钮将我带到我的 Activity

但我无法让我看到的所有代码片段都起作用。

我已经把这个放在我的 ActivityonCreate():

// Shows the up carat near app icon in ActionBar
getSupportActionBar().setDisplayUseLogoEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

我也在 ActivityonOptionsItemSelected() 方法中包含了这个:

// Handle action bar actions click
    switch (item.getItemId()) {
        case android.R.id.home:
            android.app.FragmentManager fm= getFragmentManager();
            fm.popBackStack();

            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

结果是我看到了 "back button" 克拉(如下图),但是当我点击它时没有任何反应。我应该回到我来自的Fragment。仅供参考,我的 Fragment class 实际上扩展了 Fragment(而不是 FragmentActivity)。我的 Activity 扩展了 ActionBarActivity,所以我正在寻找适用于 Android 4.0+ 的答案。此外,我的 Fragment 在 return 编辑时不需要相同的实例(必然)。它只有按钮,所以一个新的实例很好,如果它被创建,returning。

感谢您的帮助!!

需要一小行:finish()。由于 FragmentManager 通过使用 fm.popBackStack(); 从其后台弹出一个项目,它仍然需要某种操作才能转到上一个片段。添加 finish() 使当前 Activity 结束。上下文中的行:

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        // Handle action bar actions click
        switch (item.getItemId()) {
            case android.R.id.home:
                android.app.FragmentManager fm= getFragmentManager();
                fm.popBackStack();
                finish();

                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

我上面的其余代码是正确的,也是需要的,以使其全部正常工作。现在,我可以导航到我的 NavigationDrawer 片段,单击那里的按钮转到 Activity,然后按导航向上插入符号到 return 到我的 Fragment随时。这已在三星 Galaxy5 phone.

上成功测试

您在 ActionBar Android doc 使用应用程序图标向上导航 部分中没有读到的一件事是,由于您正在使用片段 return 到,你不能使用他们的 <meta-data> 标记指令 在清单文件 中指定父 activity,因为你没有 returning Activity!而是一个Fragment。因此,必须通过使用 FragmentManager.

来实现解决方法