我们应该用 ToolBar 代替 Action Bar 吗?

Should we replace Action Bar by ToolBar?

我一直在使用 ToolBar,因为它被添加到 支持 v7 库。而且我认为我用得很好。但是有一点我不能理解。 Google 为什么要创建这样的小部件?我的意思是我们可以通过使用 ActionBar 来做 ToolBar 可以做的任何事情。为什么我们必须使用ToolBar?如果有的话,ToolBarActionBar 有什么优势? ActionBar 需要用 ToolBar 代替吗?

如有任何提示,我们将不胜感激。提前致谢。

PS: 我发现 ToolBarViewGroup 的倾析物。那么,我们如何像使用 Layout 一样使用 ToolBar?有人可以 post 一些代码吗?

工具栏是在应用程序布局中使用的操作栏的概括。虽然操作栏传统上是框架控制的 Activity 不透明 window 装饰的一部分,但 工具栏可以放置在视图层次结构中的任意嵌套级别。应用程序可以选择使用 setActionBar() 方法将工具栏指定为 Activity 的操作栏。您可以找到更多信息 here。我们替换了操作栏,因为它更容易为 material 设计自定义工具栏。例如调色板和消失的动画行为。 就个人而言,我不明白为什么 android 丢弃旧控件并创建新控件。另一个例子是 RecyclerView。不明白为什么他们不改进旧的 API。

Why have we to use ToolBar?

工具栏用于 pre-devices 和旧支持库不提供的向后移植兼容性。请记住 ActionbarSherlock、android 自己制作以支持低级别 API 设备上的操作栏。

What are advantages of ToolBar over ActionBar if any?

您可以在工具栏的 XML 中轻松添加自定义视图,例如相对布局视图,特别是自定义标题和带有动画的图标。与旧的传统操作栏相比,您可以对工具栏进行更多控制。

Is it necessary to replace ActionBar by ToolBar?

如果您要在低于 2.0 的设备上支持操作栏,那么可以,您需要 back-port 操作栏兼容性。

是的,您应该用新的工具栏替换 ActionBar。

原因

  1. 外观现代,采用新的material设计。

  2. 与操作栏不同,工具栏不是 window 装饰的一部分。您可以像任何其他小部件一样定义和放置它...因此,您可以自由地将它放置在父布局中的任何位置。

  3. 您可以自由地将任何小部件放入工具栏。

  4. 您可以定义多个工具栏。

编辑

我的意思是您可以在工具栏中放置其他小部件(视图)。

为工具栏创建一个单独的布局文件(有利于可重用性)。在我的例子中,文件名是 main_toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:App="http://schemas.android.com/apk/res-auto"
    xmlns:segmentedgroup="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    App:theme="@style/ToolbarColoredBackArrow"
    android:layout_height="56dp"
    android:background="@color/primary_color" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/drawer_fntsize"
        android:text="Title"
        android:id="@+id/lbl_title"
        android:textColor="@color/title_text_color"
        android:layout_gravity="center" />

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

然后像这样在主布局中包含此工具栏

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/toolbar"
        layout="@layout/main_toolbar" />

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar" />

</RelativeLayout>

正如您在此示例中所见,我将 TextView 放置在工具栏中

why Android would create such a widget?

想象一下,如果你愿意的话,一个 Android 平板电脑。

此平板电脑是 运行 一个应用程序。该应用程序在屏幕的右下角有一个富文本编辑器,您可以在其中输入一些评论并将其格式化为 bolditalic,等等

在桌面或 Web 应用程序中,除了键盘快捷键之外,这些格式设置选项的典型方法是工具栏,就像您在 Stack Overflow 上的答案文本区域上方看到的那样。

Toolbar 之前,Android 开发人员必须滚动他们自己的工具栏,或者将格式化操作放在操作栏中。虽然后一种方法很简单,但它给上述虚构应用程序的用户带来了压力,因为用户必须不断将她的视觉焦点从编辑器(屏幕底部)切换到操作栏(屏幕顶部)。

Why have we to use ToolBar?

您不必使用 Toolbar。我有 ~300 sample apps as part of my book,目前,恰好有零个使用 Toolbar。由于我还没有写关于 Toolbar.

的章节,所以我必须在某个时候更正它

Is it necessary to replace ActionBar by ToolBar?

没有。有办法做到这一点,但没有必要。

  1. 您可以轻松自定义工具栏。
  2. 您可以在工具栏中添加许多小部件。
  3. 您可以在视图中添加多个工具栏。
  4. 您可以自由地将其放置在父布局中的任何位置。
  5. 他们有自己的 handling/managing 个子视图。

Toolbar 比标准 ActionBar 灵活得多,您可以在 Toolbar 中添加更多工具(因为它扩展了 ViewGroup),并遵循 Material 设计指南。

例如,对于工具栏,您可以执行以下操作:

常规 ActionBar 不打算以这种方式展开。

此外,您可以更好地操作工具栏内容,因为您可以将其包含在 Activity 布局 xml 文件中。就个人而言,我在顶部、工具栏和下方使用 LinearLayout 或 RelativeLayout,填充剩余的 space,FrameLayout 将在其中添加我的片段。

最后,您可以将工具栏放置在布局文件中的任意位置。

更新:

Google 已发布 Android Design Support Library。获得扩展 Appbar 的推荐方法是用 AppBarLayout 包装 Toolbar,并添加其他视图,例如 TabLayout。要像此屏幕截图中那样在工具栏上获得 FAB,您可以使用 CoordinatorLayout 包裹布局内容,然后在 FAB 上使用锚点属性。

支持 Toolbar 为您提供了更多的灵活性和自由,几乎没有额外的费用,我没有理由不进行转换。过渡到新 Toolbar 实际上是将现有应用程序移植到更 Material 设计的第一步,因为任务简单,而且它对整体外观和感觉有直接影响应用程序。

注意:两者都将支持一般应用程序导航、图标并具有向后支持。

答案取决于您的设计需要什么样的用户交互(动画工具栏)。话虽如此,您应该在工具栏上实现动画以使其成为 Material。


操作栏:

如果您只是想在顶部有一个可以承载图标、后退按钮和主题的静态栏。

工具栏:

如果您想在静态栏之外做任何事情,例如动画。

一个常见的实现和 Google 设计建议是在滚动时隐藏工具栏。 Material Design checklist: hiding app bar on scroll?

标准 toolbar 用于应用程序内容。

A Toolbaraction bar 的概括,用于应用程序布局。 action bar 传统上是 Activity 的不透明 window decor 的一部分,由 framework 控制,而 Toolbar 可以放置在任意层级的嵌套中视图层次结构。应用程序可以选择使用 setActionBar() 方法将 Toolbar 指定为 Activityaction bar

Toolbar 支持比 ActionBar 更集中的功能集。从头到尾,一个 toolbar 可能包含以下可选元素的组合:

  • 一个导航按钮。这可能是一个 Up arrow,导航菜单切换, 关闭、折叠、完成或应用程序选择的其他字形。这个 按钮应始终用于访问其他导航 Toolbar 容器内的目的地及其表示 内容或以其他方式离开由 Toolbar。导航按钮在 Toolbar 的最小高度,如果已设置。
  • 一张品牌标志图片。这可能会延伸到酒吧的高度和 可以任意宽。
  • 标题和副标题。标题应该是一个路标 Toolbar 在导航层次结构中的当前位置和 那里包含的内容。 subtitle,如果存在则应指示任何 有关当前内容的扩展信息。如果某个应用使用 logo image 应该强烈考虑省略一个 titlesubtitle.
  • 一个或多个自定义视图。应用程序可以添加任意 child 对 Toolbar 的看法。他们将出现在 布局。如果 child 视图的 Toolbar.LayoutParams 表示 Gravity CENTER_HORIZONTAL 的值视图将尝试在 available space 剩余在 Toolbar 之后的所有其他元素 已测量。
  • 一个操作菜单menu 个操作将固定到 Toolbar 提供一些常见的、重要的或典型的行动 带有可选的 overflow menu 用于其他操作。 Action 个按钮 在 Toolbar 的最小高度(如果已设置)内垂直对齐。

在现代 Android UI 中,开发人员应该更多地依赖于工具栏的视觉上不同的配色方案,而不是他们的应用程序图标。不鼓励在 API 21 及更新的设备上使用应用程序图标加标题作为标准布局。

这是文档 link -- http://developer.android.com/training/appbar/setting-up.html

请注意,它不包含您在其他布局文件中包含的代码:

<include
    android:id="@+id/toolbar"
    layout="@layout/tool_bar"/>

为什么我更改为工具栏 -- 我将最近的一个应用程序更改为工具栏的原因之一是当我们想要自定义操作栏时,它不会在不同的 Android 版本上工作,或者当我们扩展某些 类(使其透明或显示图标而不是应用程序名称)。工具栏为我们提供了所需的自定义选项。