Я пытаюсь использовать новый дизайн TabLayout в своем проекте. Я хочу, чтобы макет адаптировался к любому размеру и ориентации экрана, но его можно было бы правильно увидеть в одной ориентации.
Я имею дело с Gravity и Mode, устанавливая свой tabLayout как:
tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
Поэтому я ожидаю, что если места нет, tabLayout можно прокручивать, но если есть место, он центрируется.
Из гидов:
public static final int GRAVITY_CENTER Gravity, используемый для размещения вкладок в центре TabLayout.
public static final int GRAVITY_FILL Gravity используется для максимального заполнения TabLayout. Эта опция действует только при использовании с MODE_FIXED.
public static final int MODE_FIXED Фиксированные вкладки отображают все вкладки одновременно и лучше всего используются с контентом, который выигрывает от быстрого поворота между вкладками. Максимальное количество вкладок ограничено шириной представления. Фиксированные вкладки имеют одинаковую ширину в зависимости от самой широкой метки вкладки.
public static final int MODE_SCROLLABLE Прокручиваемые вкладки отображают подмножество вкладок в любой момент времени и могут содержать более длинные метки вкладок и большее количество вкладок. Их лучше всего использовать для просмотра контекстов в сенсорных интерфейсах, когда пользователям не нужно напрямую сравнивать ярлыки вкладок.
Итак, GRAVITY_FILL совместим только с MODE_FIXED, но at is ничего не указывает для GRAVITY_CENTER, я ожидаю, что он будет совместим с MODE_SCROLLABLE, но это то, что я получаю, используя GRAVITY_CENTER и MODE_SCROLLABLE
Таким образом, он использует SCROLLABLE в обеих ориентациях, но не использует GRAVITY_CENTER.
Это то, что я ожидал от пейзажа; но для этого мне нужно установить MODE_FIXED, поэтому я получаю в портретной ориентации:
Почему GRAVITY_CENTER не работает для SCROLLABLE, если tabLayout умещается на экране? Есть ли способ динамически установить гравитацию и режим (и увидеть, что я ожидаю)?
Большое спасибо!
ИЗМЕНИТЬ: это макет моего TabLayout:
<android.support.design.widget.TabLayout
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:background="@color/orange_pager"
android:layout_height="wrap_content" />
источник
Ответы:
Вкладка только эффекты гравитации
MODE_FIXED
.Одно из возможных решений для установки вашего ,
layout_width
чтобыwrap_content
иlayout_gravity
вcenter_horizontal
:Если вкладки меньше ширины экрана,
TabLayout
они также будут меньше и будут центрированы из-за силы тяжести. Если вкладки больше ширины экрана, ониTabLayout
будут соответствовать ширине экрана, и активируется прокрутка.источник
app:tabMaxWidth="0dp"
иandroid:layout_centerHorizontal="true"
работа по центру вкладок.вот как я это сделал
TabLayout.xml
Создать
Я внес небольшие изменения в решение @Mario Velasco для работающей части
источник
tabLayout.getWidth()
всегда возвращает ноль для меняупрощает работу, просто добавьте app: tabMode = "scrollable" и android: layout_gravity = "bottom"
именно так
источник
Поскольку я не нашел, почему происходит такое поведение, я использовал следующий код:
По сути, мне нужно вручную рассчитать ширину моего tabLayout, а затем я устанавливаю режим вкладок в зависимости от того, подходит ли tabLayout к устройству или нет.
Причина, по которой я получаю размер макета вручную, заключается в том, что не все вкладки имеют одинаковую ширину в режиме прокрутки, и это может спровоцировать использование в некоторых именах двух строк, как это случилось со мной в примере.
источник
Посмотрите на android-tablayouthelper
источник
Это решение, которое я использовал для автоматического переключения между
SCROLLABLE
иFIXED
+FILL
. Это полный код решения @ Fighter42:(Код ниже показывает, куда поместить модификацию, если вы использовали шаблон активности Google с вкладками)
Макет:
Если заполнять ширину не нужно, лучше использовать решение @karaokyo.
источник
Для этого я создал класс AdaptiveTabLayout. Это был единственный способ, который я нашел, чтобы решить проблему, ответить на вопрос и избежать / обходных проблем, которых нет в других ответах здесь.
Ноты:
MODE_SCROLLABLE
но недостаточно места дляMODE_FIXED
. Если вы не справитесь с этим случаем, это произойдет на некоторых устройствах, вы увидите разные размеры текста или две строки текста на некоторых вкладках, что выглядит плохо.wrap_content
указана в xml. Не устанавливайте в xml режим или гравитацию.AdaptiveTabLayout.java
А это класс DeviceUtils:
Пример использования:
Суть
Проблемы / Обратитесь за помощью:
Logcat:
Я не знаю, как это решить. Какие-либо предложения?
источник
источник
Очень простой пример, и он всегда работает.
источник
Это единственный код, который у меня сработал:
DisplayMetrics можно получить с помощью этого:
И ваш XML-код TabLayout должен выглядеть так (не забудьте установить для tabMaxWidth значение 0):
источник
Все, что вам нужно, это добавить следующее в свой TabLayout
Итак, у вас будет:
источник
Я решил это, используя следующие
источник
Мое окончательное решение
источник