2016-01-22 5 views
32

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

В то же время, я нашел два ButtonBarLayout при поиске ButtonBarLayout везде в Android Студия, один 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 и Строительные инструменты от 23.0.2.

ответ

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

+0

Ehhh, просто смущен, когда ориентация направлена. – SilentKnight

1

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

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

+0

Да, я просмотрел исходные коды внутреннего 'ButtonBarLayout'. – SilentKnight

2

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

Как и в библиотеке поддержки, Android реализовала это для разработчиков, использующих более ранний API. Для них нормально использовать библиотеку поддержки для этой цели.

Надеется, что это помогает :)

+0

Это не точно, я думаю. – SilentKnight

+0

Что заставляет вас думать, что это не точно? –

32

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

Я мог бы добавить, что это было сделано явно, чтобы соответствовать диалогам material design specifications. Они делают различие между бок о бок кнопок и уложены кнопок. Смотрите, например:

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

enter image description here

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

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

enter image description here

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

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

+0

Хорошее объяснение :) – SilentKnight

+0

Изображения. Всегда нужно, когда дело доходит до виджетов! – frostymarvelous

0

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

0

Что касается вашего вопроса:
Как его использовать?

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

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

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

Смежные вопросы