Подтвердить что ты не робот

Что такое ButtonBarLayout и как его использовать?

Когда я разработал, я неожиданно обнаружил новый виджет под названием android.support.v7.widget.ButtonBarLayout. Я попытался найти его в Интернете, но ничего не было найдено, даже на официальном сайте документов разработки.

Тем временем, я обнаружил два ButtonBarLayout при поиске ButtonBarLayout везде в Android Studio, один из них - android.support.v7.widget.ButtonBarLayout, а другой - com.android.internal.widget.ButtonBarLayout. Я пытался читать исходные коды обоих, я обнаружил, что они такие же, кроме имени пакета. Поэтому я подумал, что android.support.v7.widget.ButtonBarLayout пришел из com.android.internal.widget.ButtonBarLayout после того, как внутренний ButtonBarLayout прошел тесты и выпустил. В то же время ButtonBarLayout наследуется от LinearLayout.

Но есть вопрос:

  • Что мы можем получить от ButtonBarLayout буквально и как его использовать?
  • Я заметил переменную private boolean mAllowStacking. Когда он изменится, ориентация этого макета будет изменена. Но я не совсем понял, для чего он используется.

Знает ли кто-нибудь ButtonBarLayout хорошо?

PS: Я использовал Android Studio 2.0.0 Preview 4 и Gradle плагин 2.0.0-alpha3 и Поддержка поддержки Android 23.1.1 и Платформенные инструменты 23.1 и Build-tools 23.0.2.

4b9b3361

Ответ 1

Исходный код описывает 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. */

Исходный код здесь

Ответ 2

Как указывали другие, описание класса точно описывает, что это такое: an extension of LinearLayout that automatically switches to vertical orientation when it can't fit its child views horizontally.

Я мог бы добавить, что это было явно сделано в соответствии с спецификациями дизайна материалов о диалогах. Они делают различие между бок о бок кнопками и сложными кнопками. См. Например:

Кнопки "бок о бок" рекомендуются, когда текст каждой метки не превышайте максимальную ширину кнопок, например, обычно используемую OK/Отмена.

введите описание изображения здесь

В то время как вы должны идти за сложными кнопками, когда одиночная кнопка слишком велика или не хватает места для обоих:

Если текстовые ярлыки превышают максимальную ширину кнопок, используйте кнопки со стрелками для размещения текста. Позитивные действия складываются выше пренебрежительные действия.

введите описание изображения здесь

Таким образом, одним из возможных вариантов использования этого класса является создание собственных диалогов. Например, AlertDialog и AlertDialog.Builder предлагают внутреннюю поддержку диалогов с кнопками, но иногда вы просто хотите подклассы DialogFragment или AppCompatDialogFragment для лучшего управления.

Там может быть полезно настроить нижнюю панель кнопок, которая следует за рекомендациями по дизайну, и иметь полный контроль над кнопками (например, включение и отключение, то, что вы не можете сделать с помощью AlertDialog AFAIK).

Ответ 3

Вы правы в первую очередь. Макет ButtonBar, похоже, не размещен нигде в официальной документации на Android. Я попытался найти его, но безрезультатно. Однако я нашел некоторую информацию, которая определяет, что такое макет ButtonBar и когда его использовать. Надеюсь, это поможет вам.

В большинстве руководств используйте макет ButtonBar в диалоговом окне или внизу экрана, чтобы подтвердить или отклонить параметр. Изображение ниже представляет собой визуальное представление о том, как макет ButtonBar использовался на экране.

введите описание изображения здесь

Снимок экрана выше имеет следующий макет 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. Для них нормально использовать библиотеку поддержки для этой цели.

Надеюсь, что это поможет:)

Ответ 4

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

Заглянув в код, я думаю, что это LinearLayout для кнопок (duh). Вероятно, вы можете посмотреть на него, как кнопки Dialog, разделенные вертикальной проставкой: |, AllowStacking изменит ориентацию на вертикальную и гравитационную вправо, а не на дно. Я должен попробовать, чтобы дать лучший ответ

Ответ 5

ButtonBarlayout не отображается нигде в официальной документации на Android. он используется для ориентации автопереключения в соответствии с пространством.

Ответ 6

Относительно вашего вопроса:
Как мы должны использовать это?

Я предполагаю, что это недокументировано, потому что оно еще не стабильно. Это просто появилось, потому что эта длительная жалоба исходит из плохой модификации ROM от поставщика устройства.
https://code.google.com/p/android/issues/detail?id=78377

См. № 270 для разрешения относительно пути к классам и почему все классы внутри .internal. были обнародованы. И нет, даже если исправить множество ошибок из-за плохой модификации ROM, все еще есть (во многих устройствах известных брендов). Этот вопрос вскоре будет отклонен участником проекта.

Я не думаю, что мы должны использовать его только пока пока не появится документ.
Просто мои $.02, хотя.