android center выровнять выбранную вкладку в tablayout

Я использую вкладку дизайна поддержки Android. Вот мой код:

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content""
        app:tabGravity="center"
        app:tabMode="scrollable"
        />

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

Моя проблема в том, что вкладки всегда выравниваются по левому краю. Однако я хотел бы центрировать выбранную вкладку (даже в начале первая (выбранная) вкладка должна быть центрирована). Есть ли способ сделать это? Спасибо.


person Shumin Gao    schedule 18.08.2015    source источник
comment
Вы нашли ответ на это?   -  person Mark    schedule 11.09.2015
comment
Если вы получите ответ, пожалуйста, сообщите нам   -  person Sandro Simas    schedule 21.10.2015
comment
У вас есть какое-нибудь решение для этого?   -  person Rakesh Barik    schedule 31.07.2017
comment
app:tabMode=прокручиваемое изменение на app:tabMode=fixed. если вы установите прокручиваемый, то предполагается, что есть много вкладок, поэтому он начнется с левой стороны.   -  person Hussain KMR Behestee    schedule 08.05.2018


Ответы (3)


Я взглянул на TabLayout и tabContentStart устанавливает отступ только для своего первого дочернего элемента -> SlidingTabStrip, поэтому я установил его вручную с обеих сторон:

public class CenteringTabLayout extends TabLayout {
    public CenteringTabLayout(Context context) {
        super(context);
    }

    public CenteringTabLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CenteringTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        View firstTab = ((ViewGroup)getChildAt(0)).getChildAt(0);
        View lastTab = ((ViewGroup)getChildAt(0)).getChildAt(((ViewGroup)getChildAt(0)).getChildCount()-1);
        ViewCompat.setPaddingRelative(getChildAt(0), (getWidth()/2) - (firstTab.getWidth()/2),0,(getWidth()/2) - (lastTab.getWidth()/2),0);
    }
}

Первым дочерним элементом TabLayout с индексом 0 является SlidingTabStrip.

person Lubos Horacek    schedule 27.04.2016
comment
Это продолжает вызывать requestLayout() в бесконечном цикле. - person Shahzeb; 22.08.2016
comment
После переключения фрагментов вкладки сдвигаются влево. - person Denshov; 23.04.2017
comment
Решение для ужина, спасибо - person KZoNE; 18.04.2018
comment
это работает? , для меня requestlayout находится в бесконечном цикле - person M.Yogeshwaran; 01.03.2019
comment
Это также делает мои вкладки бесконечными. - person jerome2710; 05.07.2019
comment
Я не знаю, как поддерживать RTL с помощью этого решения. - person Mohamed Ibrahim; 11.05.2020
comment
java.lang.NullPointerException: (getChildAt(0) as ViewGroup).getChildAt(0) не должен быть нулевым - person Sardorbek Muhammadjonov; 05.01.2021

Возможно, вы ищете атрибут xml с именем app:tabContentStart. Этот атрибут позволяет сдвинуть активную вкладку влево в соответствии с указанным значением, которое установлено в «dp» (что-то вроде левого поля). Например, попробуйте разместить свой код следующим образом:

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="scrollable"
        app:tabContentStart="96dp"/> <-- Or whatever value you want here.

Он не совсем центрирует вкладку, но дает такой же эффект, как и вкладки Google Play Store.

person Adifyr    schedule 06.11.2015
comment
Идеальный ответ, это именно то, что я искал часами. - person Dominik; 30.08.2018

Если ваш целевой API 23 или выше, позвольте мне поделиться еще одним вариантом для рассмотрения вместе с конфигурацией app:tabContentStart, предложенной SynerFlow, которая может позволить концевой вкладке быть центрированной, а не прокручиваться к крайнему левому краю во время прокрутки. Тем не менее, я все еще выясняю подход к API до 23.

final int TAB_CONTENT_START = 96;   

tabLayout.setOnScrollChangeListener(new View.OnScrollChangeListener() {

    @Override
    public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

        final int maxAllowWidthOfTabBar = tabLayout.getMeasuredWidth() + TAB_CONTENT_START;
        if (scrollX > maxAllowWidthOfTabBar)
            tabLayout.setScrollX(maxAllowWidthOfTabBar);

    }
});
person garykwwong    schedule 19.01.2017