web-dev-qa-db-fra.com

Comment changer l'indicateur de tablayout du haut en bas?

Je veux changer l'indicateur de tablayout de bas en haut.

mon code

activity_tab.xml

<Android.support.design.widget.AppBarLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"

    Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="?attr/actionBarSize"
        Android:background="?attr/colorPrimary"

        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <Android.support.design.widget.TabLayout
        Android:id="@+id/tabs"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"

        app:tabIndicatorColor="#000000"

        app:tabMode="scrollable"
        />
</Android.support.design.widget.AppBarLayout>

<Android.support.v4.view.ViewPager
    Android:id="@+id/viewpager"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

Je veux ce résultat.

 enter image description here

comment faire

merci de me demander et désolé pour le mauvais anglais.

Cela peut être fait par l'attribut xml, utilisez Android:scaleY="-1" dans le code xml. La vue s'inversera verticalement. Utilisez la même méthode pour corriger le texte et l'image utilisés dans le titre de l'onglet. 

En fichier XML:

<Android.support.design.widget.TabLayout
    Android:id="@+id/tabLayout"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="?attr/colorPrimary"
    Android:minHeight="?attr/actionBarSize"
    Android:scaleY="-1"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

En code Java

tabLayout = (TabLayout) findViewById(R.id.tabLayout);

// Adding the tabs using addTab() method
tabLayout.addTab(tabLayout.newTab().setText("Section 1"));
tabLayout.addTab(tabLayout.newTab().setText("Section 2"));
tabLayout.addTab(tabLayout.newTab().setText("Section 3"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

TextView tv1 = (TextView)(((LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(0)).getChildAt(1));
tv1.setScaleY(-1);
TextView tv2 = (TextView)(((LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(1)).getChildAt(1));
tv2.setScaleY(-1);
TextView tv3 = (TextView)(((LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(2)).getChildAt(1));
tv3.setScaleY(-1);

Sample screenshot

13
muhammed arshad k

N'utilisez pas scale = -1 et des choses comme ça. 

À partir de XML, vous pouvez utiliser app:tabIndicatorGravity="top"

À partir du code, vous pouvez utiliser setSelectedTabIndicatorGravity(INDICATOR_GRAVITY_TOP)

10
Michael Bolboceanu

Malheureusement, vous ne pouvez pas le faire en définissant un attribut ou en le définissant dans le code. TabLayout a la propriété mTabStrip de SlidingTabStrip (classe interne), définie comme privée finale

private final SlidingTabStrip mTabStrip;

, de sorte que vous ne pouvez pas y accéder, en étendant TabLayout.

SlidingTabStrip (qui étend LinearLayoyut) est donc une vue qui annule la méthode draw

@Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        // Thick colored underline below the current selection
        if (mIndicatorLeft >= 0 && mIndicatorRight > mIndicatorLeft) {
            canvas.drawRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight,
                    mIndicatorRight, getHeight(), mSelectedIndicatorPaint);
        }
    }

Ainsi, vous pouvez voir qu’il dessine le rectangle avec les propriétés top et bottom.

Peut-être qu'à l'avenir, ils auront un drapeau pour le changer.

4
Damir Mailybayev

J'ai une approche différente pour le faire ..

  1. Définissez la couleur de l'indicateur d'onglet de la même manière que la couleur d'arrière-plan de la disposition des onglets (afin que vous ne voyiez pas l'indicateur d'onglet en bas)

  2. Ajoutez une disposition linéaire (horizontale) juste au-dessus de la disposition d'onglets contenant les vues (même nombre que égal au nombre d'onglets).

<LinearLayout Android:layout_width="match_parent" Android:layout_height="5dp" Android:orientation="horizontal" Android:background="@color/tab_bg" Android:weightSum="3">

<View
    Android:id="@+id/view1"
    Android:layout_width="0dp"
    Android:layout_height="match_parent"
    Android:layout_weight="1"
    Android:elevation="10dp"
    Android:background="@drawable/selector_tab_indicator_white"/>

<View
    Android:id="@+id/view2"
    Android:layout_width="0dp"
    Android:layout_height="match_parent"
    Android:layout_weight="1"
    Android:elevation="10dp"
    Android:background="@drawable/selector_tab_indicator_blue"/>

<View
    Android:id="@+id/view3"
    Android:layout_width="0dp"
    Android:layout_height="match_parent"
    Android:layout_weight="1"
    Android:elevation="10dp"
    Android:background="@drawable/selector_tab_indicator_blue"/>

</LinearLayout>

  1. Maintenant, ajustez simplement les arrière-plans de la vue par programme.

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }
    
    @Override
    public void onPageSelected(int position) {
        setTitle(getPageTitle(position));
    
        switch(position){
    
            case 0:
                view1.setBackgroundResource( R.drawable.selector_tab_indicator_white );
                view2.setBackgroundResource( R.drawable.selector_tab_indicator_blue );
                view3.setBackgroundResource( R.drawable.selector_tab_indicator_blue );
                break;
    
            case 1:
                view1.setBackgroundResource( R.drawable.selector_tab_indicator_blue );
                view2.setBackgroundResource( R.drawable.selector_tab_indicator_white );
                view3.setBackgroundResource( R.drawable.selector_tab_indicator_blue );
                break;
    
            case 2:
                view1.setBackgroundResource( R.drawable.selector_tab_indicator_blue );
                view2.setBackgroundResource( R.drawable.selector_tab_indicator_blue );
                view3.setBackgroundResource( R.drawable.selector_tab_indicator_white );
                break;
    
            default:
                view1.setBackgroundResource( R.drawable.selector_tab_indicator_white );
                view2.setBackgroundResource( R.drawable.selector_tab_indicator_blue );
                view3.setBackgroundResource( R.drawable.selector_tab_indicator_blue );
                break;
        }
    }
    
    @Override
    public void onPageScrollStateChanged(int state) {
    
    }
    

    });

Utilisez ces sélecteurs pour personnaliser les vues

selector_tab_indicator_white.xml

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:shape="rectangle">
<corners
    Android:radius="50dp"/>
<stroke
    Android:width="1dp"
    Android:color="#c4c0c0" />
<solid
    Android:color="#fafafa" />

selector_tab_indicator_blue.xml

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:shape="rectangle">
<corners
    Android:radius="0dp"/>
<stroke
    Android:width="1dp"
    Android:color="@color/tab_bg" />
<solid
    Android:color="@color/tab_bg" />

Le résultat:  enter image description here

2
Nayan

Vous avez seulement besoin de ces lignes

tabLayout.setRotationX(180);

    tabListed = ((LinearLayout)tabLayout.getChildAt(0));
    for(int position = 0;position<tabListed.getChildCount();position++) {
        LinearLayout item=((LinearLayout) tabListed.getChildAt(position));
        item.setBackground(getDrawable(R.drawable.square_tab));
        item.setRotationX(180);
    }

La première rotation d'onglets tourne à 180º, puis tous les onglets sont tournés à 180º. Alors qu'ils soient bons à nouveau.

 enter image description here

Vous pouvez y parvenir en tournant le TabLayout comme ceci:

tabLayout.setRotationX(180);

Ensuite, vous devez faire pivoter tous ses enfants TextView, ou vous pouvez définir une vue personnalisée pour TabLayout, au lieu de rechercher récursivement un objet TextView:

TabLayout.Tab tab = tabLayout.getTabAt(i);
tab.setCustomView(R.layout.layout_tab_view);

layout_tab_view.xml

    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:rotationX="180"
        Android:text="HOME"/>

Je suppose que vous perdez certaines fonctionnalités par défaut si vous définissez une vue personnalisée, telle que la désignation du titre de fragment à partir de PagerAdapter et de TextView, apparence désactivée, mais vous pouvez la lier d'une manière ou d'une autre.

 enter image description here

2
box

Cela ne peut pas être fait avec l'attribut xml, mais en paramétrant l'image en arrière-plan de l'onglet avec une couleur pleine en haut et transparente en bas.

 <Android.support.design.widget.TabLayout
          ...
            app:tabBackground="@drawable/bg_tab"
            ...
 /> 

bg_tab.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/cap" Android:state_selected="true" />
</selector>

cap.png

 enter image description here

transparent en bas

1
Kartik_Agarwal

Je sais que cette question a été posée il y a 2 ans, mais je n'ai trouvé aucune solution simple sans utiliser de bibliothèque (smartTabLayout n'a pas la propriété SelectedTextColour). 

inversez votre tabLayout pour obtenir l'indicateur en haut
Android:rotationX="180"
maintenant, le texte de cet onglet sera également inversé, donc pour contrer cela
Nous devrons créer un onglet personnalisé. Créer un fichier XML, par exemple: layout_custom_tab

<TextView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/tab.text"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:maxLines="1"
Android:padding="10dp"
Android:rotationX="180"
Android:textAllCaps="true"
Android:textSize="12sp"
Android:textColor="@color/white"
/>

Remarque: vous n'avez pas besoin de RelativeLayout ou quoi que ce soit d'autre quand il n'y a qu'un seul élément 

créez votre propre TabLayout et définissez-le customView. 

public class TabLayoutPlus extends TabLayout {

public TabLayoutPlus(Context context) {
    super(context);
}

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

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

@Override
public void setupWithViewPager(ViewPager viewPager) {
    super.setupWithViewPager(viewPager);
    this.removeAllTabs();

    PagerAdapter adapter = viewPager.getAdapter();

    for (int i = 0, count = adapter.getCount(); i < count; i++) {
        Tab tab = this.newTab();
        View customView = LayoutInflater.from(getContext()).inflate(R.layout.layout_custom_tab, null);
        TextViewPlus tv = (TextViewPlus) customView.findViewById(R.id.tab_text);
        tv.setText(adapter.getPageTitle(i));
        tab.setCustomView(customView);
        this.addTab(tab.setText(adapter.getPageTitle(i)));
    }
 }    
}

votre TabLayout dans votre activité ressemblera à ceci 

<TabLayoutPlus
    Android:id="@+id/tablayout"
    Android:layout_width="match_parent"
    Android:layout_height="36dp"
    Android:layout_above="@+id/camera.buttons.layout"
    Android:layout_centerHorizontal="true"
    Android:background="@color/cardscan.background"
    Android:rotationX="180"
    app:tabGravity="center"
    app:tabIndicatorColor="@color/colorPrimary"
    app:tabMode="fixed"
    app:tabSelectedTextColor="@color/colorPrimary"
    app:tabTextColor="@color/white"
    />

si vous devez mettre en surbrillance la couleur du texte de l'onglet sélectionné 

private void setSelectedTab(TabLayoutPlus.Tab tab) {
    View view = tab.getCustomView();
    TextViewPlus tabtext = (TextViewPlus) view.findViewById(R.id.tab_text);
    tabtext.setTextColor(ContextCompat.getColor(this, R.color.colorPrimary)); // color you want to highlight your text with
}

private void setUnselectedTab(TabLayoutPlus.Tab tab){
    View view = tab.getCustomView();
    TextViewPlus tabtext = (TextViewPlus) view.findViewById(R.id.tab_text);
    tabtext.setTextColor(ContextCompat.getColor(this, R.color.white)); // color you want to lowlight your text with
}

Maintenant, ajoutez simplement OnTabSelectedListener

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            setSelectedTab(tab);
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            setUnselectedTab(tab);
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            setSelectedTab(tab);
        }
    });
1
Akshay More
    I solved using this method

     set scaleY="-1" , this will rotate TabLayout to 180 degrees, as a result tab layout rotated reverse with text and rotate your TextView to Horizontally to 180 degrees, that will solve the problem, see the code below

     1. activity.xml

     <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">


        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent">


            <Android.support.v4.view.ViewPager
                Android:id="@+id/viewpager_exp"
                Android:layout_above="@+id/tabs_RL"
                Android:layout_width="match_parent"
                Android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />



            <RelativeLayout
                Android:id="@+id/tabs_RL"
                Android:layout_alignParentBottom="true"
                Android:layout_width="match_parent"
                Android:layout_height="@dimen/footer_height">


                <Android.support.design.widget.TabLayout
                    Android:id="@+id/tabs"
                    Android:layout_width="match_parent"
                    Android:layout_height="@dimen/dimen_60"
                    Android:background="@color/white"
                    Android:clipToPadding="false"
                    Android:paddingLeft="0dp"
                    Android:paddingRight="0dp"
                    Android:scaleY="-1"
                    app:layout_scrollFlags="snap|enterAlways"
                    app:tabGravity="fill"
                    app:tabMaxWidth="0dp"
                    app:tabIndicatorHeight="4dp"
                    app:tabIndicatorColor="@color/dark_pink1"
                    app:tabMinWidth="50dp"
                    app:tabPaddingEnd="0dp"
                    app:tabPaddingStart="0dp"
                    app:tabMode="fixed" />

            </RelativeLayout>
        </RelativeLayout>

    </RelativeLayout>

 2. custom_tab.xml

<customviews.CusMediumTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/tab"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:gravity="center_horizontal"
    Android:textColor="#000000"
    Android:textSize="@dimen/dimen_12"
    Android:rotationX="180"
    Android:textStyle="bold" />

 3. MainActivity.class


 tabLayout.setupWithViewPager(viewPager);

tabOne = (CusMediumTextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabOne.setText("Tab1");
        tabOne.setTextColor(getResources().getColor(R.color.light_black));
        tabOne.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.home_icon, 0, 0);


        tabTwo = (CusMediumTextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabTwo.setText("Tab2");
        tabTwo.setTextColor(getResources().getColor(R.color.light_black));
        tabTwo.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.settin_icon, 0, 0);


        tabThree = (CusMediumTextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabThree.setText("Tab3");
        tabThree.setTextColor(getResources().getColor(R.color.light_black));
        tabThree.setCompoundDrawablesWithIntrinsicBounds( 0,R.drawable.delete_icon, 0, 0);


        tabFour = (CusMediumTextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
        tabFour.setText("Tab4");
        tabFour.setTextColor(getResources().getColor(R.color.light_black));
        tabFour.setCompoundDrawablesWithIntrinsicBounds( 0, R.drawable.msg_icon,0, 0);

        tabLayout.getTabAt(0).setCustomView(tabOne);
        tabLayout.getTabAt(1).setCustomView(tabTwo);
        tabLayout.getTabAt(2).setCustomView(tabThree);
        tabLayout.getTabAt(3).setCustomView(tabFour);
0
Rishi