AppCompat 操作栏库不显示添加的片段

Posted

技术标签:

【中文标题】AppCompat 操作栏库不显示添加的片段【英文标题】:AppCompat Action Bar library not displaying added fragments 【发布时间】:2013-08-02 15:43:11 【问题描述】:

编辑:如果我扩展FragmentActivity 而不是ActionBarActivity,我的布局会再次出现(当然没有ActionBar)。

ActionBar4.x 设备上按预期工作,但在我的2.3 设备上,我得到的只是ActionBar 和它下方的空白屏幕Fragment 似乎没有被添加到 Activity

themes.xml

<style name="AppTheme" parent="AppBaseTheme">
    <item name="actionBarStyle">@style/Widget.ActionBar</item>
</style>

themes-v11.xml

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:actionBarStyle">@style/Widget.ActionBar</item>
</style>

styles.xml

<style name="Widget.ActionBar" parent="@style/Widget.AppCompat.ActionBar">
    <item name="android:background">@color/actionbar_background</item>
    <item name="background">@color/actionbar_background</item>
</style>

活动onCreate()

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
myFragment = new WallFragment();
fragmentTransaction.add(android.R.id.content, 
    myFragment, myFragment.FRAGMENT_TAG);
fragmentTransaction.commit();

我正在使用 Gradle 在我的应用中包含 AppCompat ActionBar 库。

compile 'com.android.support:appcompat-v7:18.0.+'

【问题讨论】:

【参考方案1】:

在 Android SDK 的工具目录中加载 hierarchyviewer,看起来您放置片段的视图在 4.x 设备上是 android.R.id.content,在运行 AppCompat ActionBar 库的 2.3 设备上是 R.id.action_bar_activity_content

不幸的是,在添加片段时,您可能需要基于平台版本进行分支。这是在 http://code.google.com/p/android/issues/detail?id=58108 中建议的(还不确定 3.x 设备)。

使用此方法可以获得添加Fragment 的正确视图。我的测试还表明,3.x 设备在使用 AppCompat ActionBar 库时的行为类似于 2.3 设备。

public static int getContentViewCompat() 
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH ?
               android.R.id.content : R.id.action_bar_activity_content;

hierarchyviewer 截图

2.3

4.x

【讨论】:

另外需要注意的是R.id.action_bar_activity_content直到setContentView()在ActionBarActivity中被调用后才会被创建。使用 ABS,我可以使用 android.R.id.content,而无需在 Activity 中设置布局,而在 Android 2.x 中不是这种情况。 这也解决了当您的内容似乎出现在 Android 2.3 上的 ActionBar 上方时的问题 -- 感谢您注意到这一点! @Shellum 如果您将 appcompat-v7 更新到版本 19.0.0. 或更新版本,则不再需要在 android.R.id.contentR.id.action_bar_activity_content。如您在comment of Chris Banes on issue 59077 中阅读的那样,不同的行为在最新版本的库中统一。 看起来即使在 appcompat-v7 修订版 19.0.0 修复之后,2.x 设备也不会添加片段,除非您设置内容视图(我只是使用空框架布局)。关于不再需要 R.id.action_bar_activity_content 的部分是正确的,但在 2.x 设备上它会默默地无法添加片段。 @rrbrambley 请在错误跟踪器上报告此问题。原bug尚未关闭:code.google.com/p/android/issues/detail?id=59077

以上是关于AppCompat 操作栏库不显示添加的片段的主要内容,如果未能解决你的问题,请参考以下文章

如何在工具栏的左侧添加一个按钮?

使用androidx获取片段内的actionBar

使用 Appcompat 进行自定义不起作用

AppCompat v22.1.0 没有为片段正确主题化所有 xml 小部件

Kotlin - 范围搜索栏库

Tablayout 标题不出现