Подтвердить что ты не робот

SlidingTabLayout для установки на экран

Я использую Google SlidingTabLayout. Поскольку у меня есть только 3 вкладки для отображения, я вижу пустое место после последней вкладки. Пожалуйста, снимок экрана ниже. enter image description here

Может кто-нибудь объяснить мне, как поместить вкладки на весь экран. Спасибо за ваше время.

4b9b3361

Ответ 1

В SlidingTabLayout.java найдите

protected TextView createDefaultTabView(Context context)

и добавьте эти строки к этому методу:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
textView.setWidth(size.x / 3);

Это исправило это для меня. В принципе, вы получаете ширину экрана и делитесь на 3 (количество вкладок) и устанавливаете это как ширину для TextField, которая составляет вашу вкладку.

UPDATE:

В текущем источнике Google добавил метод setDistributeEvenly(Boolean);, поэтому вместо него можно использовать slidingTabs.setDistributeEvenly(true);. При использовании старшего исходного кода либо используйте мое решение выше, либо обновляйте его до новейшего источника (рекомендуется последний).

Ответ 2

Используйте это перед установкой setViewPager():

slidingTabs.setDistributeEvenly(true);

Если вы получили эту ошибку Cannot resolve method 'setDistributeEvenly(boolean)', вы должны обновить свой SlidingTabLayout.java и SlidingTabStrip.java из исходного кода ввода-вывода Google:

SlidingTabLayout.java

SlidingTabStrip.java

Ответ 3

Изменение файла SlidingTabLayout.java может помочь. Однако решение может показаться не очень общим. В файле SlidingTabLayout.java найдите метод

protected TextView createDefaultTabView(Context context)

Под методами "set" TextView введите следующий код.

textView.setLayoutParams(new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f));

Каждая полоса вкладок представляет собой только индивидуальный LinearLayout.

Ответ 4

Ответ SubliemeSiem находится на правильном пути. Более гибкий и более короткий ответ заключается в том, чтобы добавить вес 1 к каждому TextView, который составляет вкладку.

В SlidingTabLayout.java найдите

protected TextView createDefaultTabView(Context context)

Это была строка 171 на момент написания. Добавьте эту строку в функцию.

textView.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f));

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

Ответ 5

Вы можете создать собственный макет табуляции и назначить его на SlidingTabLayout для раздувания.

custom_tab.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/customTab">
  <TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/customText"/>
</FrameLayout>

В вашем коде:

    viewPager = (ViewPager) rootView.findViewById(R.id.viewPager);
    viewPager.setAdapter(new SampleAdapter(getChildFragmentManager()));
    SlidingTabLayout tabLayout = (SlidingTabLayout)rootView.findViewById(R.id.slidingTab);
    tabLayout.setCustomTabView(R.layout.custom_tab,R.id.customText);
    tabLayout.setViewPager(viewPager);

Сохраняя ширину до 0 dp и вес как 1 (число произвольное), макет должен позаботиться о том, чтобы все ваши вкладки равны размеру экрана. Это также должно работать для любого количества вкладок. Вам не нужно изменять свой SlidingTabLayout.java.

Ответ 6

Google выпустила Библиотека поддержки дизайна. Теперь вы можете использовать TabLayout. Чтобы вкладки соответствовали экрану, вы можете вызвать setTabMode(TabLayout.MODE_FIXED);

Ответ 7

более динамичный подход

Изменить SlidingTabLayout.java

найдите private void populateTabStrip() метод и замените

mTabStrip.addView(tabView);

с

 // get dimension of current layout
 DisplayMetrics display = this.getResources().getDisplayMetrics();
   int width = display.widthPixels;
        //your tab names here
        String[] tabTitles = {"tab1", "tab2", "tab3"}
        // compare max width and number of tabs length 
        //will not fit to the maxwidth it will distribute the tabs evenly
        if(width%(width/tabTitles.length) == 0){
            mTabStrip.addView(tabView,
                    new LinearLayout.LayoutParams(width/tabTitles.length, ViewGroup.LayoutParams.WRAP_CONTENT));
        } else {
            mTabStrip.addView(tabView);
        }

Ответ 8

в SlidingTabLayout.java по следующему методу непосредственно перед оператором return:

protected TextView createDefaultTabView(Context context)

Я добавил эти строки к этому методу:

final PagerAdapter adapter = mViewPager.getAdapter();
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f / adapter.getCount());
textView.setLayoutParams(param);

что очень близко к ответу, помеченному как решение вопроса, однако мне не нужно было использовать диспетчер окон.

Ответ 9

попробуйте этот android:layout_weight="1" в вашем макете xml для каждого текстового поля.