2015-07-29 2 views
30

Я просто добавил новый компонент TabLayout в свое приложение. Как вы знаете, существуют два разных режима для вкладок app:tabMode="scrollable" и app:tabMode="fixed".Удалить разрыв строки в TabLayout

Когда я использую app:tabMode="fixed" я получаю следующий результат:

enter image description here

Там нет маржи/обивка на левой и правой стороне, но текст обернут.

Но когда я использую app:tabMode="scrollable" я получаю следующий результат:

enter image description here

Текст не завернуты, а вот странно запас на правой стороне, и я не могу избавиться от него.

Я также попытался установить tabGravity либо app:tabGravity="center", либо app:tabGravity="fill", но не достиг каких-либо изменений.

Было бы здорово, если бы кто-нибудь из вас, умных парней и девушек, получил решение для меня.

Cheers, Lukas

+0

Таковы два режима TabLayout. Если вы использовали фиксированный, то все вкладки имеют одинаковый размер. Это означает, что для вкладок 1 и 3 меньше места.Если вы используете прокручиваемую, текст находится в одной строке, а вкладка занимает минимальное пространство и имеет левую гравитацию. Для разработки Android вы все равно не должны относиться к себе с одним размером экрана. Возможно, вам стоит подумать о внедрении чего-то вроде: http://stackoverflow.com/a/31363206/2977237. – tachyonflux

+0

Почему бы вам не попробовать создать собственный макет вкладки и управлять им. Используйте пользовательский макет в качестве вкладки и дайте слушателям макет детей. – Tauqir

ответ

22

Одним из решений здесь является раздувание пользовательского макета для каждой вкладки, что даст вам больше контроля над появлением каждой вкладки. Это делается с помощью метода setCustomView().

Обратите внимание: это будет выглядеть по-разному на разных разрешениях экрана.

Всегда сложно сделать его идеальным на каждом устройстве, но, по крайней мере, с помощью этого метода вы получите больше контроля, так как вы можете использовать разные XML-файлы с разным размером для разных разрешений/размеров экрана.

Один из подходов заключался в том, чтобы размер шрифта был как можно большим, без обрезания на каждом размере экрана.

У меня есть простой пример работы, который ограничивает текст на каждой вкладке одной строкой, однако в этом простом примере он также заставляет длинный текст на боковых вкладках эллипсизовать без изменения размера шрифта. Следующим шагом будет выяснить оптимальный размер шрифта для каждого размера экрана и создать для каждой отдельной макету xml.

Тэги: custom_tab.Файл XML, с android:singleLine="true" указано:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <TextView 
     android:id="@+id/custom_text" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:background="?attr/selectableItemBackground" 
     android:gravity="center" 
     android:textSize="16dip" 
     android:textColor="#ffffff" 
     android:singleLine="true" 
     /> 
</LinearLayout> 

Вот макет для MainActivity:

<RelativeLayout 
    android:id="@+id/main_layout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:background="?attr/colorPrimary" 
     android:elevation="6dp" 
     android:minHeight="?attr/actionBarSize" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tab_layout" 
     app:tabMode="fixed" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/toolbar" 
     android:background="?attr/colorPrimary" 
     android:elevation="6dp" 
     app:tabTextColor="#d3d3d3" 
     app:tabSelectedTextColor="#ffffff" 
     app:tabIndicatorColor="#ff00ff" 
     android:minHeight="?attr/actionBarSize" 
     /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     android:layout_below="@id/tab_layout"/> 

</RelativeLayout> 

Вот код активности, который включает в себя FragmentPagerAdapter:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Get the ViewPager and set it's PagerAdapter so that it can display items 
     ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
     PagerAdapter pagerAdapter = 
       new PagerAdapter(getSupportFragmentManager(), MainActivity.this); 
     viewPager.setAdapter(pagerAdapter); 

     // Give the TabLayout the ViewPager 
     TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.setupWithViewPager(viewPager); 

     // Iterate over all tabs and set the custom view 
     for (int i = 0; i < tabLayout.getTabCount(); i++) { 
      TabLayout.Tab tab = tabLayout.getTabAt(i); 
      tab.setCustomView(pagerAdapter.getTabView(i)); 
     } 
    } 


    class PagerAdapter extends FragmentPagerAdapter { 

     String tabTitles[] = new String[] { "Aufzeichnung", "Berichte", "Neue Aufgabe", }; 
     Context context; 

     public PagerAdapter(FragmentManager fm, Context context) { 
      super(fm); 
      this.context = context; 
     } 

     @Override 
     public int getCount() { 
      return tabTitles.length; 
     } 

     @Override 
     public Fragment getItem(int position) { 

      switch (position) { 
       case 0: 
        return new BlankFragment(); 
       case 1: 
        return new BlankFragment(); 
       case 2: 
        return new BlankFragment(); 
      } 

      return null; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      // Generate title based on item position 
      return tabTitles[position]; 
     } 

     public View getTabView(int position) { 
      View tab = LayoutInflater.from(MainActivity.this).inflate(R.layout.custom_tab, null); 
      TextView tv = (TextView) tab.findViewById(R.id.custom_text); 
      tv.setText(tabTitles[position]); 
      return tab; 
     } 

    } 
} 

И вот с помощью вышеуказанного кода:

enter image description here

Обратите внимание, что если вы удалите android:singleLine="true", это выглядит так, подобно тому, как она выглядит в вашем вопросе:

enter image description here

+1

Обратите внимание, что в руководствах по дизайну материалов рекомендуется, чтобы размер текста был '14sp' или' 12sp', если он занимает две строки: https: // material.io/guidelines/components/tabs.html#tabs-specs – w3bshark

0

в макете XML, если Вы usign TextView, используйте android:maxLines="1" или android:singleLine="true" Смотрите, если это работает. И если не TextView, тогда, пожалуйста, разместите свой xml здесь.

+1

Как я уже писал выше, я использую компонент TabLayout из Библиотеки поддержки дизайна. Вот мой XML, если вы хотите посмотреть: http://pastebin.com/cLCvYTw3 – finki

+0

Я думаю, что у него есть атрибут с именем «textAppearance», вы можете определить состояние singleLine в файле стиля и установить его в свой текстовый файл –

+0

@ NguyễnHoàiNam TabLayout имеет атрибут 'app: tabTextAppearance', но он печально игнорирует' singleLine' и 'maxLines'. Вместо этого он работает для 'textSize',' textAllCaps' и т. Д. – TalkLittle

21

Вот быстрый хак, намного короче, чем при использовании setCustomView(): используйте атрибут android:theme на вашем TabLayout:

<android.support.design.widget.TabLayout 
    android:id="@+id/tab_layout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/TabLayout_Theme" 
    app:tabMode="fixed"/> 

Тогда в ваших темах XML:

Мы должны сделать это таким образом, потому что, к сожалению, атрибут android:singleLine игнорируется на app:tabTextAppearance, установленном на TabLayout. app:tabTextAppearance действительно полезен только для изменения размера текста.

7

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

<android.support.design.widget.TabLayout 
       android:id="@+id/htab_tabs" 
       android:layout_width="wrap_content" 
       android:layout_height="?attr/actionBarSize" 
       android:layout_gravity="bottom" 
       app:tabIndicatorColor="@android:color/white" 
       app:tabMode="scrollable" /> 
+0

Идеальное решение. Работал для меня. –

+0

Это я искал. работа для меня тоже – ltvie

0

Если это вариант вы можете центрирования вкладки с RelativeLayout и, установив андроид: layout_centerHorizontal = «истинный»

Это даст вам равное поле на левой и правой стороне.

например.

<RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      android:layout_centerHorizontal="true" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      app:tabMode="scrollable" /> 
    </RelativeLayout> 
0

решить мою проблему, назначив стиль приложения: tabTextAppearance

<android.support.design.widget.TabLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:tabTextAppearance="@style/MyCustomTabTextAppearance"> 

стиль:

<style name="MyCustomTabTextAppearance" parent="@style/AppTheme"> 
    <item name="android:singleLine">true</item> 
    <item name="android:textSize">@dimen/_5sdp</item> 
</style> 

Вы можете установить TextSize также.

+0

Он не будет работать по мере необходимости. TextAppearance использует только стиль attrs, см. Исходный код setTextAppearance в TextView. singleLine не будет использоваться, только размер текста будет уменьшен. – Maxdestroyer

-1

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

<android.support.design.widget.TabLayout 
app:tabPaddingStart="-1dp" 
app:tabPaddingEnd="-1dp" 

Отсюда: http://panavtec.me/playing-with-the-new-support-tablayout

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