ActionBar与Toolbar的区别或者说ActionBar和Toolbar

11

我已经阅读了与AppCompat库中的工具栏及其所有功能相关的内容。在Android开发者博客(这里),我注意到一些事情:

工具栏在AppCompat中得到了充分支持,并且具有与框架小部件相同的功能和API。

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

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

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

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

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

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

这里的工具栏是在应用栏内部。(ActionBar和AppBar是相同的,对吧?)那有什么用呢?在某些博客中还可以用设计支持库的工具栏替换AppBar。

通常情况下,在工具栏后面会得到content_layout,因此我们将在工具栏之后拥有以下行:

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

我曾经遇到一个问题,就是当我使用工具栏(而不是放在应用栏中)时,内容位于工具栏之上并且可以被点击,导致整个工具栏被隐藏。因此,我必须在代码中将工具栏移动到内容下方,以便它出现在我的内容上方。

那么,要使用什么?工具栏?AppBarLayout?AppBarLayout中的工具栏?

每个组件的预期用途是什么?

更新:

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

禁用窗口操作栏的用途是什么?

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

如何使用setSupportActionBar(toolbar)进行设置?


5
这是我见过的最好的问题之一。从超过10年的专业开发和与许多编程语言和框架的合作经验来看,我必须说Android的架构和设计真的很令人头疼。很多很多次我问自己难道事情不能更简单、更清洁吗?我喜欢你的问题,因为询问“为什么”是知识中非常重要的一个方面,而这在SO上并不经常发生。 - Saeed Neamati
@SaeedNeamati 谢谢 :) - kirtan403
@SaeedNeamati 我非常同意你的观点!Android开发真的很糟糕。 - Ayub
2个回答

10

AppBarLayout是一个容器,您可以在其中放置ToolBarTabLayout或其他内容。所有这些内容都将显示在屏幕顶部,无论您用哪种布局来处理其余的内容。如果您愿意,可以单独使用Toolbar而不使用AppBarLayout,但那样您需要将其包含在您用于其余内容的ViewGroup中,并将其放置在底部,以避免与其他内容重叠。

AppBar可以使您免于此类麻烦并提供一些额外的功能,例如滚动行为。此处有更多相关信息(链接)

还要注意,AppBarLayout严重依赖于作为直接子项在CoordinatorLayout中使用。如果您在不同的ViewGroup中使用AppBarLayout,则大多数其功能将无法工作。


谢谢,所以AppBarLayout可以包含所有普通的小部件,如RelativeLayout、ImageView、TextView等吗? - kirtan403
考虑到它是一个垂直的LinearLayout。所以是的。 - RexSplode

2

AppBarLayout是一个垂直的LinearLayout,实现了许多材料设计应用栏概念的功能,即滚动手势。

子项应通过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_width="match_parent"
     android:layout_height="match_parent">

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

     <!-- Your scrolling content -->

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

 <android.support.design.widget.AppBarLayout
         android:layout_height="wrap_content"
         android:layout_width="match_parent">

     <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

另请参阅AppBarLayout的结构


这是从Android开发者网站精确复制的内容。 - kirtan403
是的。我已经在我的答案中提供了参考。我在我的答案中放置了代码和描述,这将有助于在主链接内容更改或可能被删除的情况下使用。 - pRaNaY

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