ActionBar vs Toolbar 或 ActionBar and Toolbar

Posted

技术标签:

【中文标题】ActionBar vs Toolbar 或 ActionBar and Toolbar【英文标题】:ActionBar vs Toolbar or ActionBar and Toolbar 【发布时间】:2016-03-14 17:58:17 【问题描述】:

我已阅读有关 AppCompat 库中的工具栏及其所有功能的信息。我在 android 开发者博客 (here) 中注意到的一些事情是:

AppCompat 完全支持工具栏,并具有功能和 API 对等性 使用框架小部件。

他们还提到我们可以更好地控制它的外观。

但是,当我在 Android Studio 中添加一个活动时,我得到了这个:

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar_add_contacts"
    android:layout_
    android:layout_
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay">

    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout> 

这里的 Toolbar 在 AppBar 里面。 (ActionBar 和 AppBar 是一样的。不是吗?) 那有什么用。在一些博客中,我还读到 AppBar 可以替换为设计支持库的工具栏。

通常您会在工具栏之后获得 content_layout。所以我们将在工具栏之后有下面的行。

<include layout="@layout/content_myactivity" />

所以,一旦我遇到内容在工具栏上方(仅使用工具栏,不在 appbar 内)隐藏整个工具栏,并且仍然可点击的问题。所以我不得不在代码中将工具栏移到我的内容下方,让它出现在我的内容上方。

那么,用什么?工具栏?应用栏布局? AppBarLayout 内的工具栏?

每一个的用途是什么?

更新

所以我已经在activity_layout 文件中添加了Toolbar。那为什么要使用setSupportActionBar(toolbar);来设置工具栏和添加主题AppTheme.NoActionBar。这是 Android Studio 中所有活动的正常行为。

用禁用窗口动作栏有什么用

<item name="windowActionBar">false</item>

并使用setSupportActionBar(toolbar) 设置它?

【问题讨论】:

这是我见过的最好的问题之一。来自 10 多年的专业发展,以及与许多编程语言和框架的合作,我不得不说 Android 的架构和设计真的很让人头疼。很多次我问自己,事情就不能更简单或更干净吗?我喜欢你的问题,因为问“为什么”是知识的一个非常重要的方面,所以不会发生那么多。 @SaeedNamati 谢谢 :) @SaeedNamati 我非常同意你的观点! android开发真的很糟糕。 【参考方案1】:

AppBarLayout 是一个容器,您可以在其中放置ToolBarTabLayout,也许还有其他东西。无论您对其余内容使用什么布局,所有这些都将显示在屏幕顶部。如果需要,您可以使用 Toolbar 而不使用 AppBarLayout,但是您需要将其包含在您使用其余内容的 ViewGroup 中。并将它放在它的底部,这样它就不会被其他东西覆盖。

AppBar 可以帮助您避免这种情况,并提供一些附加功能,例如滚动行为。写着here btw.

另请注意,AppBarLayout 在很大程度上取决于在 CoordinatorLayout 中被用作直接子代。如果您在不同的ViewGroup 中使用AppBarLayout,它的大部分功能都将不起作用。

【讨论】:

谢谢,所以 AppBarLayout 可以包含所有正常的小部件,如 Relativelayout、ImageView、TextView 等? 认为它是一个垂直的LinearLayout。所以是的。【参考方案2】:

AppBarLayout 是一个垂直的LinearLayout,它实现了 Material Design 应用栏概念的许多功能,即滚动手势。

儿童应通过setScrollFlags(int) 和相关的布局xml 属性提供他们想要的滚动行为:app:layout_scrollFlags。

此视图在很大程度上取决于在 CoordinatorLayout 中用作直接子级。如果您在不同的ViewGroup 中使用 AppBarLayout,它的大部分功能都将不起作用。

AppBarLayout 还需要一个单独的滚动兄弟,以便知道何时滚动。绑定是通过AppBarLayout.ScrollingViewBehavior 行为类完成的,这意味着您应该将滚动视图的行为设置为AppBarLayout.ScrollingViewBehavior 的实例。包含完整类名的字符串资源可用。

您还可以像下面这样实现AppBarLayout 的多个孩子

<android.support.design.widget.CoordinatorLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_
     android:layout_>

 <android.support.v4.widget.NestedScrollView
         android:layout_
         android:layout_
         app:layout_behavior="@string/appbar_scrolling_view_behavior">

     <!-- Your scrolling content -->

 </android.support.v4.widget.NestedScrollView>

 <android.support.design.widget.AppBarLayout
         android:layout_
         android:layout_>

     <android.support.v7.widget.Toolbar
             ...
             app:layout_scrollFlags="scroll|enterAlways"/>

     <android.support.design.widget.TabLayout
             ...
             app:layout_scrollFlags="scroll|enterAlways"/>

 </android.support.design.widget.AppBarLayout>

来源:AppBarLayout

另见Structure of AppBarLayout

【讨论】:

这是来自 android 开发者网站的准确副本 是的。我已经在我的回答中给出了参考。我在我的答案中添加了代码和描述,这将有助于在主链接内容发生更改或可能被删除的情况下。

以上是关于ActionBar vs Toolbar 或 ActionBar and Toolbar的主要内容,如果未能解决你的问题,请参考以下文章

Android Toolbar使用及Fragment中的Toolbar处理

自定义ToolBar

Android Fragment使用 Toolbar使用及Fragment中的Toolbar处理

Toolbar使用

从片段内部访问 Toolbar/ActionBar 对象

Android编程最完整的ToolBar开发指南