SlidingTabLayout для установки на экран
Я использую Google SlidingTabLayout. Поскольку у меня есть только 3 вкладки для отображения, я вижу пустое место после последней вкладки.
Пожалуйста, снимок экрана ниже.
![enter image description here]()
Может кто-нибудь объяснить мне, как поместить вкладки на весь экран. Спасибо за ваше время.
Ответы
Ответ 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 для каждого текстового поля.