Android API 19可以使用工具栏吗?(API 21可以正常工作)

9

我使用了如何使用DrawerLayout在ActionBar / Toolbar上方显示并在状态栏下方显示? Suyash的答案(我也添加了一个工具栏,可能不正确)将导航抽屉放在“操作栏”上。

对于API级别21,我使用了工具栏而不是“操作栏”,它可以正常工作。

但是对于API 19,这不起作用:

    if(Build.VERSION.SDK_INT > 19) {
      final Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
        setSupportActionBar(toolbar);
    }

你有没有想法可以在API 19上将NavigationDrawer放在"actionbar"(或工具栏)之上?

在我添加工具栏之前,在Suyash的解决方案中,它看起来就像:hideActionBar + android:windowTranslucentStatus。对于api21,操作栏消失了,对于api19除了变成灰色外没有改变。我做错了什么吗? - tauri
4个回答

7
如果您使用工具栏,那么您应该能够在任何API中查看完全相同的工具栏。
为了实现这一点,您需要在res/layout中有一个XML文件:
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"/>

在你的主布局中,你应该将它包含进去:
<include
    android:id="@+id/app_bar"
    layout="@layout/app_bar" />

同时,您应该在styles.xml中将样式设置为无操作栏。
<style name="AppTheme.Base" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primaryDark</item>
    <item name="colorAccent">@color/accent</item>
</style>

但对于API 21,你应该有另一个styles.xml:

<style name="AppTheme" parent="AppTheme.Base">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primaryDark</item>
    <item name="android:colorAccent">@color/accent</item>
</style>

最后,在您的主活动中

toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);

最后,对于任何你想在工具栏上进行的操作,获取它并像旧的 Action Bar 一样处理:

getSupportActionBar().setHomeAsUpEnabled(true);

在API 21上将您的主题从AppCompat更改为其他内容是不必要的(实际上会破坏ActionBarActivity的大部分主题)。 - ianhanniballake
感谢您的帮助。看起来我没有在styles.xml中添加<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar"></style>。 - tauri
@joaquin。我在我的项目中使用了AppCompat工具栏(就像你说的那样)。但是对于低于20的API,我的应用程序已经停止了。为什么? - Mina Dahesh
@MinaDahesh,你能提供一些有用的数据吗?比如你遇到的异常信息。 - Joaquin Iurchuk
1
@MinaDahesh,那是因为我确定你没有以正确的方式配置styles.xml文件。尝试将其设置为无操作栏。仔细检查我的答案。 - Joaquin Iurchuk
显示剩余2条评论

4

预Lollipop设备的Material Design :

所有需要使用Action Bar/Toolbar的主题都必须继承自Theme.AppCompat。可用的变体包括Light和NoActionBar。

当膨胀任何要在操作栏上显示的内容(例如工具栏中的列表导航的SpinnerAdapter)时,请确保使用操作栏的主题上下文,通过getSupportActionBar().getThemedContext()获取。


Android Support Library 22.1 :

AppCompat允许您为工具栏使用android:theme(弃用之前使用的app:theme),更好的是,它将android:theme支持带到了API 11+设备上的所有视图中。


1

AndroidX

如果您不想使用 Android 支持库,现在有一个更好的解决方案可供选择。

androidx.appcompat.widget.Toolbar

迁移到AndroidX类映射,可通过此官方链接获取

此外,您还可以直接从Android Studio将整个项目重构为AndroidX: 从菜单中可以执行
重构 > 迁移到AndroidX

更多信息请参见此处

对于我来说,重构 > 迁移到AndroidX功能未将我的xml工具栏转换为AndroidX,因此,我发现前面的链接非常有用。


1

首先,您需要将com.android.support:appcombat-v7:25.3.0添加为依赖项。然后在要添加工具栏的活动中导入android.support.v7.widget.Toolbar。通过这种方式,您可以为api 19实现工具栏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接