2015-07-08 1 views
8

Я использую TabLayout из библиотеки поддержки Android Design. Как я могу использовать MODE_SCROLLABLE вместе с GRAVITY_FILL, чтобы он выглядел одинаково для всех устройств и ориентации?Каков наилучший способ установить вкладку табуляции для таблеток?

В настоящее время, если я использую MODE_SCROLLABLE, он выглядит хорошо на планшете 7 ", но на 10" планшетах, вкладки выровнены влево. Я хочу иметь возможность использовать GRAVITY_FILL для всех размеров.

Это мой tablayout:

<android.support.design.widget.TabLayout 
    android:id="@+id/tab_layout" 
    android:layout_width="match_parent" 
    android:layout_height="72dp"    
/> 

и я устанавливаю режим в коде

tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 

ответ

10

Пер с TabLayout.GRAVITY_FILL documentation:

Гравитация используется для заполнения TabLayout столько, сколько возможное. Этот параметр действует только при использовании с MODE_FIXED.

Поэтому, установив режим MODE_SCROLLABLE, вкладки всегда выровнены от исходного края - единственная разница между таблетками и телефонами для MODE_SCROLLABLE минимальная ширина вкладок, как установлено tabs material design spec.

Обратите внимание, что вы можете указать, как гравитацию и режим вкладок с помощью XML, если вы хотите, чтобы установить вид всегда будет прокручивать:

<android.support.design.widget.TabLayout 
    android:id="@+id/tab_layout" 
    android:layout_width="match_parent" 
    android:layout_height="72dp" 
    app:tabMode="scrollable" 
/> 
+1

Я хочу посмотреть, что прокручивать, если достаточно ширина не доступна. Но если ширина доступна, я хочу, чтобы они использовали GRAVITY_FILL. Есть ли способ достичь этого? В основном я хочу убедиться, что tablayout всегда использует gravity_fill в телефонах, 7 "планшетах и ​​10" планшетах в обеих ориентациях. Но если я использую GRAVITY_FILL с MODE_FIXED, текст в моих вкладках становится усеченным. – Sammys

+0

В соответствии с [спецификацией использования табуляции] (https: // www.google.com/design/spec/components/tabs.html#tabs-usage), фиксированные и прокручиваемые вкладки имеют другой вариант использования и не обязательно взаимозаменяемы. Вот почему по умолчанию единственное, что меняется на основе размера экрана, - это гравитация. – ianhanniballake

0

Я встретил ту же проблему.

На мой взгляд, нет легкого решения проблемы. В FIX_MODE все вкладки в tablayout имеют одинаковую ширину, основанную на максимальном элементе.

И в SCROLL_MODE все вкладки имеют собственную ширину.

Таким образом, решение становится немного сложным.

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

Другое решение использует customview в tablayout, как указано в этом article, тогда вы можете установить mannualy ширины элемента.

4
//to get phones width in dp 
int w= (int)((Resources.getSystem().getDisplayMetrics().widthPixels)/Resources.getSystem().getDisplayMetrics().density); 
//To check screen width is greater than approx total no of tabswidth 
//I have calculated tabswidth by setting mode scrollable in layout and trying in defferent phones i got space left in 384dp width phone and no space in 360dp width phone so i took 370 
     if(w>370){ 
      tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
      tabLayout.setTabMode(TabLayout.MODE_FIXED); 
     } 
    else 
     tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 
3

Я использовал очень похожее решение для Jayesh, однако моя использует минимальную ширину для вкладок и вычисляет, какой режим использовать на основе этого. Таким образом, вам нужно только знать, какой минимальный допустимый размер для ваших вкладок. Если бы они все поместились в комнату, чтобы сэкономить, она растянет их, чтобы заполнить все пространство, если их будет слишком много, это сделает их минимальной шириной и переключится на прокрутку.

DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
     float dpWidth = displayMetrics.widthPixels/displayMetrics.density; 
     //For some reason, setting minWidth in xml and then accessing it here doesn't work, returns 0 
     int minWidth = 80; 
     tabLayout.setMinimumWidth(minWidth); 

     //If there are less tabs than needed to necessitate scrolling, set to fixed/fill 
     if(tabLayout.getTabCount() < dpWidth/minWidth){ 
      tabLayout.setTabMode(TabLayout.MODE_FIXED); 
      tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
     }else{ 
      //Otherwise, set to scrollable 
      tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 

     } 

В XML, то Tablayout только обладает этими свойствами

<android.support.design.widget.TabLayout 
    android:id="@+id/sliding_tabs" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:tabMaxWidth="0dp" 
    /> 
+0

Благодаря @Matt это помогает мне. – Sajithv

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

  • Нет связанных вопросов^_^