什么是ButtonBarLayout以及我们应该如何使用它?

时间:2016-01-22 08:12:23

标签: android android-support-library

当我开发时,我意外地找到了一个名为android.support.v7.widget.ButtonBarLayout的新窗口小部件。我试图在互联网上搜索它,但没有发现任何东西,即使在官方开发文档网站上也是如此。

与此同时,当我在 Android Studio 中搜索ButtonBarLayout时,我发现了两个ButtonBarLayout,一个是android.support.v7.widget.ButtonBarLayout,另一个是{{1} }。我试图读取两者的源代码,我发现除了包名称它们是相同的。所以我认为在内部com.android.internal.widget.ButtonBarLayout 通过测试并发布之后,android.support.v7.widget.ButtonBarLayout可能来自com.android.internal.widget.ButtonBarLayout。与此同时,ButtonBarLayout继承自ButtonBarLayout

但是有一些问题:

  • 我们可以从LinearLayout字面上得到什么?我们应该如何使用它?
  • 我注意到变量ButtonBarLayout。当它改变时,这种布局的方向将会改变。但我真的不明白它的用途。

那么有人知道private boolean mAllowStacking吗?

PS:我使用 2.0.0预览4 Android Studio 2.0.0-alpha3的 Gradle插件 23.1 Android支持库 23.1 构建 - 平台工具工具 23.0.2

7 个答案:

答案 0 :(得分:36)

正如其他人所指出的那样,类描述确切地说明了它是什么:an extension of LinearLayout that automatically switches to vertical orientation when it can't fit its child views horizontally.

我可以补充一点,这显然是为了适应material design specifications对话框。它们区分并排按钮和堆叠按钮。例如见:

  

当每个标签的文字都有时,建议使用并排按钮   不超过最大按钮宽度,如常用   确定/取消按钮。

enter image description here

当单个按钮太大或者两者都没有足够的空间时,你应该选择堆叠按钮:

  

当文本标签超出最大按钮宽度时,请使用堆叠按钮   容纳文本。上面列出了肯定行动   不屑一顾的行为。

enter image description here

因此,这个类的一个可能用途是设计自己的对话框。例如,AlertDialogAlertDialog.Builder为带按钮的对话框提供内部支持,但有时您只想将DialogFragmentAppCompatDialogFragment子类化以获得更好的控制。

在那里,设置符合设计指南的底部按钮栏并完全控制按钮(如启用和禁用,使用AlertDialog AFAIK无法做到的事情)可能会很有用。

答案 1 :(得分:12)

source code描述ButtonBarLayout如下:

/**
 * An extension of LinearLayout that automatically switches to vertical
 * orientation when it can't fit its child views horizontally.
 */

因此,从本质上讲,它只不过是一个智能LinearLayout,它根据屏幕上的可用空间管理自动切换方向。

相同的ButtonBarLayout.java文件在评论中描述了mAllowStacking,如下所示:

/** Whether the current configuration allows stacking. */

Source Code Here

答案 2 :(得分:3)

你是对的。 ButtonBar布局似乎没有在官方Android文档中的任何位置展示。我试着去搜索它,但无济于事。但是我找到了一些信息来定义什么是ButtonBar布局以及何时使用它。希望这对你有帮助。

大多数教程在对话框或屏幕底部使用Buttonbar布局来确认或拒绝选项。下图是可视化表示ButtonBar布局在屏幕中的使用方式。

enter image description here

上面的屏幕截图具有以下布局xml:

<LinearLayout
    style="?android:attr/buttonBarStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/Button01"
        style="?android:attr/buttonBarButtonStyle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Show" />

    <Button
        android:id="@+id/Button02"
        style="?android:attr/buttonBarButtonStyle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Change" />
</LinearLayout>

<EditText
    android:id="@+id/myView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" >

    <requestFocus />
</EditText>

基本上Android在这里所做的只是在LinearLayout中创建两个按钮,每个按钮都将match_parent参数设置为宽度。因此,每个按钮的大小只有屏幕的一半。 Android实际上已经消除了创建单独按钮并正确定位它们以适应不同屏幕的麻烦,通过创建一个完全处理它的简单小部件。

与支持库一样,Android已经为使用早期API的开发人员实现了这一功能。他们为此目的使用支持库是正常的。

希望这会有所帮助:)

答案 3 :(得分:1)

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/com/android/internal/widget/ButtonBarLayout.java

查看代码,我认为它是按钮(duh)的LinearLayout。你可以看一下它就像对话框按钮除以垂直间隔:| 。 AllowStacking会将方向更改为垂直,将重力更改为右侧而不是底部。我应该尝试一下以提供更好的答案

答案 4 :(得分:0)

ButtonBarlayout在官方Android文档中没有任何功能。 它用于根据空间自动切换方向。

答案 5 :(得分:0)

关于你的问题:
我们该如何使用它?

我猜它没有记录,因为它还不稳定 它只是突然出现,因为这种持久的抱怨源于设备供应商对ROM的不良修改 https://code.google.com/p/android/issues/detail?id=78377

有关类路径的解决方案以及为什么 .internal。中的所有类都已公开,请参阅#270。 并且即使修复了很多ROM修改过程中的错误仍然存​​在(在许多知名品牌的设备中)。项目成员很快拒绝了这个问题。

我认为我们不应该使用它,直到文件出现为止 只是我的.02美元。

答案 6 :(得分:0)

只是为了补充其他答案,如果你们想检查 ButtonBarLayout 的方向,您应该在值调用测量后检查方向。

换句话说(Kotlin):

buttonBarLayout.post {
    val orientation = buttonBarLayout.orientation
    val height = buttonBarLayout.measuredHeight
}