扩展 AppCompatActivity 时片段返回堆栈不起作用

Fragment back stack does not work when extending AppCompatActivity

我正在使用 AppCompat 库版本 22.1 中引入的新 AppCompatActivity

当我扩展这个 Activity 时,硬件后退按钮不再弹出我的片段的后退堆栈,而是关闭 Activity。

以下是我如何更改 activity 中的片段:

public void changeFragment(Fragment f) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_holder, f);
    ft.addToBackStack(null);
    ft.commit();
}

如果我将 MainActivity extends AppCompatActivity 更改为 MainActivity extends Activity,问题就会消失,我可以通过我的片段倒退。

将对 getFragmentManager() 的调用更改为 getSupportFragmentManager() 会导致设备 运行 Android < 5.0 丢失 Material 主题,这是实施的主要原因AppCompatActivity第一名。

我的清单中引用的样式<application android:theme="@style/AppTheme">

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/primary_material_light</item>
    <item name="colorPrimaryDark">@color/primary_dark_material_light</item>
    <item name="colorAccent">@color/accent_material_light</item>
</style>

使用 getSupportFragmentManager() 代替 getFragmentManager()

您是否要从 Theme.AppCompat.* 扩展您的应用主题?

我可以通过覆盖 Activity 中的 onBackPressed() 来解决这个问题:

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

如果有人知道为什么在使用 AppCompatActivity 时需要这个额外的步骤,我很想知道。