Что такое 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.
Ответы
Ответ 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, хотя.