Android Destek Tasarım Sekmesi Düzeni: Yerçekimi Merkezi ve Kaydırılabilir Mod


101

Projemde yeni Tasarım TabLayout'u kullanmaya çalışıyorum. Düzenin her ekran boyutuna ve yönüne uyarlanmasını istiyorum, ancak tek bir yönde doğru şekilde görülebilir.

TabLayout'u şu şekilde ayarlayan Yerçekimi ve Modu ile uğraşıyorum:

    tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

Bu nedenle, oda yoksa, sekme Düzeni kaydırılabilir, ancak oda varsa ortalanmasını bekliyorum.

Kılavuzlardan:

public static final int GRAVITY_CENTER Yerçekimi, sekmeleri TabLayout'un ortasına yerleştirmek için kullanılır.

public static final int GRAVITY_FILL Yerçekimi, TabLayout'u olabildiğince doldurmak için kullanılır. Bu seçenek yalnızca MODE_FIXED ile birlikte kullanıldığında etkili olur.

public static final int MODE_FIXED Sabit sekmeler, tüm sekmeleri eşzamanlı olarak görüntüler ve en iyi sekmeler arasında hızlı pivotlardan yararlanan içerikle kullanılır. Maksimum sekme sayısı, görünümün genişliğiyle sınırlıdır. Sabit sekmeler, en geniş sekme etiketine göre eşit genişliğe sahiptir.

public static final int MODE_SCROLLABLE Kaydırılabilir sekmeler, herhangi bir anda bir sekme alt kümesini görüntüler ve daha uzun sekme etiketleri ve daha fazla sayıda sekme içerebilir. Kullanıcıların doğrudan sekme etiketlerini karşılaştırması gerekmediğinde, en iyi dokunmatik arayüzlerdeki bağlamlara göz atmak için kullanılırlar.

Dolayısıyla GRAVITY_FILL yalnızca MODE_FIXED ile uyumludur, ancak at, GRAVITY_CENTER için hiçbir şey belirtmez, MODE_SCROLLABLE ile uyumlu olmasını bekliyorum, ancak GRAVITY_CENTER ve MODE_SCROLLABLE kullanarak elde ettiğim şey budur

görüntü açıklamasını buraya girin

Dolayısıyla her iki yönde de SCROLLABLE kullanıyor, ancak GRAVITY_CENTER kullanmıyor.

Bu manzara için beklediğim şey; ancak buna sahip olmak için MODE_FIXED ayarlamam gerekiyor, bu yüzden portre modunda elde ettiğim şey:

görüntü açıklamasını buraya girin

TabLayout ekrana uyuyorsa GRAVITY_CENTER neden SCROLLABLE için çalışmıyor? Yerçekimini ve modu dinamik olarak ayarlamanın (ve ne beklediğimi görmenin) bir yolu var mı?

Çok teşekkür ederim!

DÜZENLENMİŞ: Bu, TabLayout'umun Düzeni:

<android.support.design.widget.TabLayout
    android:id="@+id/sliding_tabs"
    android:layout_width="match_parent"
    android:background="@color/orange_pager"
    android:layout_height="wrap_content" />

@ Fighter42 buna herhangi bir çözüm buldunuz mu? Ben de aynı problemle karşı karşıyayım.
Spynet

Bulduğum tek yol, sekmelerinizin boyutunu (manuel olarak) almak ve ardından uygun olup olmadığına bağlı olarak mizanpaj parametrelerini dinamik olarak yapılandırmaktı.
Javier Delgado

@ Fighter42, kullandığınız çözüm için bazı örnek kodlar gönderebilir misiniz?
Sammys

1
Cevabımın mantıklı olmadığını biliyorum ama bana yardımcı oluyor. Metinden önce ve sonra boşluklar koyun. Sonra kaydırılabilir hale gelecektir. her iki modda.
05'te AmmY

Yanıtlar:


131

Yalnızca sekme yerçekimi efektleri MODE_FIXED.

Olası bir çözüm ayarlamaktır layout_widthiçin wrap_contentve layout_gravityiçin center_horizontal:

<android.support.design.widget.TabLayout
    android:id="@+id/sliding_tabs"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    app:tabMode="scrollable" />

Çıkıntılar ekran genişliğinden daha küçükse, TabLayoutkendisi de daha küçük olacak ve yerçekimi nedeniyle ortalanacaktır. Sekmeler ekran genişliğinden daha büyükse, ekran genişliğiyle TabLayouteşleşecek ve kaydırma etkinleşecektir.


1
Uygulamam için Materyal tasarım kullanıyorum. Androidhive.info/2015/09/… ' deki örneği takip ettim. Kitkat ve Jelly bean cihazlarında sekme kaydırılabilir çalışmıyor. Lolipop'ta Sekmeyi kaydırabiliyorum, ancak lolipop cihazları dışında Sekme kaydırılabilir çalışmıyor ancak kaydırma iyi çalışıyor. Sorunun ne olacağını öğrenebilir miyim?
user2681579

Bu benim için API 15 / support.design:25.1.0 üzerinde çalışmadı. Pencere genişliğinden daha dar olduğunda sekmeler sola yaslanmıştı. Sekmeleri ortalamak için ayarlandı app:tabMaxWidth="0dp"ve android:layout_centerHorizontal="true"çalıştı.
Baker

1
Benim için çalıştı. Sekmeler her zaman ortalanır, ancak gerçekte kaydırılamazlarsa, tüm genişliği doldurmazlar.
José Augustinho

15

ben böyle yaptım

TabLayout.xml

<android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:background="@android:color/transparent"
            app:tabGravity="fill"
            app:tabMode="scrollable"
            app:tabTextAppearance="@style/TextAppearance.Design.Tab"
            app:tabSelectedTextColor="@color/myPrimaryColor"
            app:tabIndicatorColor="@color/myPrimaryColor"
            android:overScrollMode="never"
            />

Oncreate

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
        mTabLayout = (TabLayout)findViewById(R.id.tab_layout);
        mTabLayout.setOnTabSelectedListener(this);
        setSupportActionBar(mToolbar);

        mTabLayout.addTab(mTabLayout.newTab().setText("Dashboard"));
        mTabLayout.addTab(mTabLayout.newTab().setText("Signature"));
        mTabLayout.addTab(mTabLayout.newTab().setText("Booking/Sampling"));
        mTabLayout.addTab(mTabLayout.newTab().setText("Calendar"));
        mTabLayout.addTab(mTabLayout.newTab().setText("Customer Detail"));

        mTabLayout.post(mTabLayout_config);
    }

    Runnable mTabLayout_config = new Runnable()
    {
        @Override
        public void run()
        {

           if(mTabLayout.getWidth() < MainActivity.this.getResources().getDisplayMetrics().widthPixels)
            {
                mTabLayout.setTabMode(TabLayout.MODE_FIXED);
                ViewGroup.LayoutParams mParams = mTabLayout.getLayoutParams();
                mParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
                mTabLayout.setLayoutParams(mParams);

            }
            else
            {
                mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            }
        }
    };

@Mario Velasco'nun çalıştırılabilir kısımdaki çözümünde küçük değişiklikler yaptım


Bu çözüm, Tiago'nun çözümünde bahsettiğim sorunların aynısına sahip.
Sotti

Bu Çözüm sekmede simge olmadan çalışır, ya metin içeren bir simgem varsa? : /
Emre Tekin

@EmreTekin evet bir simgeyle çalışıyor, sekmelerimde metinli simgeler vardı
Flux

tabLayout.getWidth()her zaman benim için sıfır döndürür
ishandutta2007

8

Bu davranışın neden olduğunu bulamadığım için aşağıdaki kodu kullandım:

float myTabLayoutSize = 360;
if (DeviceInfo.getWidthDP(this) >= myTabLayoutSize ){
    tabLayout.setTabMode(TabLayout.MODE_FIXED);
} else {
    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
}

Temel olarak, tabLayout'umun genişliğini manuel olarak hesaplamalıyım ve ardından tabLayout'un cihaza uyup uymadığına bağlı olarak Sekme Modunu ayarlıyorum.

Düzenin boyutunu manuel olarak almamın nedeni, Kaydırılabilir modda tüm sekmelerin aynı genişliğe sahip olmamasıdır ve bu, örnekte bana olduğu gibi bazı adların 2 satır kullanmasına neden olabilir.


Bu çözümle metin potansiyel olarak küçültülebilir ve 2 satır da kullanılabilir. Bu konudaki diğer cevaplara ve çözümlere bakın. Bunun görünme riskini azaltıyorsunuz, ancak TabLayout, screenWidth'den biraz daha küçük olduğunda yine de sıklıkla görünecektir.
Sotti

8

işleri basit tutar, sadece app ekleyin: tabMode = "kaydırılabilir" ve android: layout_gravity = "bottom"

aynen böyle

<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="bottom"
app:tabMode="scrollable"
app:tabIndicatorColor="@color/colorAccent" />

görüntü açıklamasını buraya girin


7
Bu, yaratıcının istediği şey değil. Bu yaklaşımla ilgili sorun, metnin küçük olduğu telefonlarda 2 sekme veya 3 üç sekmeye sahip olduğunuz senaryolarda, sekmelerin sol tarafta olduğu Google Play Store gibi bir düzene sahip olmanızdır. Oluşturucu, sekmelerin mümkün olduğunda uçtan uca ulaşmasını, aksi takdirde kaydırılmasını ister.
Sotti

Aynı sorun. Düzeltebilir misin?
Hoang Duc Tuan

7

Bak android-tablayouthelper

TabLayout.MODE_FIXED ve TabLayout.MODE_SCROLLABLE arasında otomatik geçiş, toplam sekme genişliğine bağlıdır.


Ancak, sekme Başlıkları dinamik olduğunda. Metin sonraki satıra giriyor. Ve sekme için özel Düzen kullanıyorsanız. Sonunda metin üç nokta şeklinde
AndroidGeek

4

Bu, SCROLLABLEve FIXED+ arasında otomatik olarak geçiş yapmak için kullandığım çözümdür FILL. @ Fighter42 çözümünün tam kodudur:

(Aşağıdaki kod, Google'ın sekmeli etkinlik şablonunu kullandıysanız, değişikliği nereye koyacağınızı gösterir)

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    // Set up the tabs
    final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(mViewPager);

    // Mario Velasco's code
    tabLayout.post(new Runnable()
    {
        @Override
        public void run()
        {
            int tabLayoutWidth = tabLayout.getWidth();

            DisplayMetrics metrics = new DisplayMetrics();
            ActivityMain.this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int deviceWidth = metrics.widthPixels;

            if (tabLayoutWidth < deviceWidth)
            {
                tabLayout.setTabMode(TabLayout.MODE_FIXED);
                tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
            } else
            {
                tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            }
        }
    });
}

Yerleşim:

    <android.support.design.widget.TabLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

Genişliği doldurmanız gerekmiyorsa, @karaokyo çözümünü kullanmak daha iyidir.


bu iyi çalışıyor; manzara ve portre arasında geçiş yapmak, tam olarak beklediğiniz şeyi yapar. Google bunu sekmeli etkinlik için varsayılan şablonda uygulamalıdır.
Someone Somewhere

Bu yanıt, Tiago'nun çözümünde bahsettiğim sorunların aynısına sahiptir.
Sotti

4

Bunu başarmak için bir AdaptiveTabLayout sınıfı oluşturdum. Problemi gerçekten çözmenin, soruyu cevaplamanın ve buradaki diğer cevapların bulamadığı problemlerden kaçınmanın / geçici çözüm bulmanın tek yolu buydu.

Notlar:

  • Telefon / tablet düzenlerini yönetir.
  • Yeterli yerin olduğu MODE_SCROLLABLEancak yeterli yerin olmadığı durumları yönetir MODE_FIXED. Bu durumu ele almazsanız, bazı cihazlarda farklı metin boyutları görürsünüz veya bazı sekmelerde iki satırlık metin fırlatırsınız ki bu kötü görünür.
  • Gerçek ölçümler alır ve herhangi bir varsayımda bulunmaz (ekran 360dp genişliğinde veya her neyse ...). Bu, gerçek ekran boyutları ve gerçek sekme boyutlarıyla çalışır. Bu, çevirilerle iyi çalıştığı anlamına gelir çünkü herhangi bir sekme boyutu kabul etmez, sekmeler ölçülür.
  • Ekstra işten kaçınmak için onLayout aşamasındaki farklı geçişlerle ilgilenir.
  • Düzen genişliği wrap_contentxml üzerinde olmalıdır . Xml'de herhangi bir mod veya yerçekimi ayarlamayın.

AdaptiveTabLayout.java

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.util.AttributeSet;
import android.widget.LinearLayout;

public class AdaptiveTabLayout extends TabLayout
{
    private boolean mGravityAndModeSeUpNeeded = true;

    public AdaptiveTabLayout(@NonNull final Context context)
    {
        this(context, null);
    }

    public AdaptiveTabLayout(@NonNull final Context context, @Nullable final AttributeSet attrs)
    {
        this(context, attrs, 0);
    }

    public AdaptiveTabLayout
    (
            @NonNull final Context context,
            @Nullable final AttributeSet attrs,
            final int defStyleAttr
    )
    {
        super(context, attrs, defStyleAttr);
        setTabMode(MODE_SCROLLABLE);
    }

    @Override
    protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b)
    {
        super.onLayout(changed, l, t, r, b);

        if (mGravityAndModeSeUpNeeded)
        {
            setModeAndGravity();
        }
    }

    private void setModeAndGravity()
    {
        final int tabCount = getTabCount();
        final int screenWidth = UtilsDevice.getScreenWidth();
        final int minWidthNeedForMixedMode = getMinSpaceNeededForFixedMode(tabCount);

        if (minWidthNeedForMixedMode == 0)
        {
            return;
        }
        else if (minWidthNeedForMixedMode < screenWidth)
        {
            setTabMode(MODE_FIXED);
            setTabGravity(UtilsDevice.isBigTablet() ? GRAVITY_CENTER : GRAVITY_FILL) ;
        }
        else
        {
            setTabMode(TabLayout.MODE_SCROLLABLE);
        }

        setLayoutParams(new LinearLayout.LayoutParams
                (LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

        mGravityAndModeSeUpNeeded = false;
    }

    private int getMinSpaceNeededForFixedMode(final int tabCount)
    {
        final LinearLayout linearLayout = (LinearLayout) getChildAt(0);
        int widestTab = 0;
        int currentWidth;

        for (int i = 0; i < tabCount; i++)
        {
            currentWidth = linearLayout.getChildAt(i).getWidth();

            if (currentWidth == 0) return 0;

            if (currentWidth > widestTab)
            {
                widestTab = currentWidth;
            }
        }

        return widestTab * tabCount;
    }

}

Ve bu DeviceUtils sınıfıdır:

import android.content.res.Resources;

public class UtilsDevice extends Utils
{
    private static final int sWIDTH_FOR_BIG_TABLET_IN_DP = 720;

    private UtilsDevice() {}

    public static int pixelToDp(final int pixels)
    {
        return (int) (pixels / Resources.getSystem().getDisplayMetrics().density);
    }

    public static int getScreenWidth()
    {
        return Resources
                .getSystem()
                .getDisplayMetrics()
                .widthPixels;
    }

    public static boolean isBigTablet()
    {
        return pixelToDp(getScreenWidth()) >= sWIDTH_FOR_BIG_TABLET_IN_DP;
    }

}

Örnek kullanın:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout
    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">

    <com.com.stackoverflow.example.AdaptiveTabLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="?colorPrimary"
        app:tabIndicatorColor="@color/white"
        app:tabSelectedTextColor="@color/text_white_primary"
        app:tabTextColor="@color/text_white_secondary"
        tools:layout_width="match_parent"/>

</FrameLayout>

Özet

Sorunlar / Yardım isteyin:

  • Bunu göreceksin:

Logcat:

W/View: requestLayout() improperly called by android.support.design.widget.TabLayout$SlidingTabStrip{3e1ebcd6 V.ED.... ......ID 0,0-466,96} during layout: running second layout pass
W/View: requestLayout() improperly called by android.support.design.widget.TabLayout$TabView{3423cb57 VFE...C. ..S...ID 0,0-144,96} during layout: running second layout pass
W/View: requestLayout() improperly called by android.support.design.widget.TabLayout$TabView{377c4644 VFE...C. ......ID 144,0-322,96} during layout: running second layout pass
W/View: requestLayout() improperly called by android.support.design.widget.TabLayout$TabView{19ead32d VFE...C. ......ID 322,0-466,96} during layout: running second layout pass

Nasıl çözeceğimi bilmiyorum. Herhangi bir öneri?

  • TabLayout alt ölçümlerini yapmak için, bazı dökümler ve varsayımlar yapıyorum (Alt öğe diğer görünümleri içeren bir LinearLayout gibi ...) Bu, daha fazla Tasarım Destek Kitaplığı güncellemelerinde sorunlara neden olabilir. Daha iyi bir yaklaşım / öneriler?

4
 <android.support.design.widget.TabLayout
                    android:id="@+id/tabList"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    app:tabMode="scrollable"/>


2

Çok basit bir örnek ve her zaman işe yarıyor.

/**
 * Setup stretch and scrollable TabLayout.
 * The TabLayout initial parameters in layout must be:
 * android:layout_width="wrap_content"
 * app:tabMaxWidth="0dp"
 * app:tabGravity="fill"
 * app:tabMode="fixed"
 *
 * @param context   your Context
 * @param tabLayout your TabLayout
 */
public static void setupStretchTabLayout(Context context, TabLayout tabLayout) {
    tabLayout.post(() -> {

        ViewGroup.LayoutParams params = tabLayout.getLayoutParams();
        if (params.width == ViewGroup.LayoutParams.MATCH_PARENT) { // is already set up for stretch
            return;
        }

        int deviceWidth = context.getResources()
                                 .getDisplayMetrics().widthPixels;

        if (tabLayout.getWidth() < deviceWidth) {
            tabLayout.setTabMode(TabLayout.MODE_FIXED);
            params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        } else {
            tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
        }
        tabLayout.setLayoutParams(params);

    });

}

Fikir için teşekkürler. Davamda ufak bir değişiklikle cazibe gibi çalışıyor
Eren Tüfekçi

1

Benim için çalışan tek kod bu:

public static void adjustTabLayoutBounds(final TabLayout tabLayout,
                                         final DisplayMetrics displayMetrics){

    final ViewTreeObserver vto = tabLayout.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {

            tabLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            int totalTabPaddingPlusWidth = 0;
            for(int i=0; i < tabLayout.getTabCount(); i++){

                final LinearLayout tabView = ((LinearLayout)((LinearLayout) tabLayout.getChildAt(0)).getChildAt(i));
                totalTabPaddingPlusWidth += (tabView.getMeasuredWidth() + tabView.getPaddingLeft() + tabView.getPaddingRight());
            }

            if (totalTabPaddingPlusWidth <= displayMetrics.widthPixels){

                tabLayout.setTabMode(TabLayout.MODE_FIXED);
                tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

            }else{
                tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
            }

            tabLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        }
    });
}

DisplayMetrics şu şekilde alınabilir:

public DisplayMetrics getDisplayMetrics() {

    final WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
    final Display display = wm.getDefaultDisplay();
    final DisplayMetrics displayMetrics = new DisplayMetrics();

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
        display.getMetrics(displayMetrics);

    }else{
        display.getRealMetrics(displayMetrics);
    }

    return displayMetrics;
}

Ve TabLayout XML'iniz şöyle görünmelidir (tabMaxWidth'i 0 olarak ayarlamayı unutmayın):

<android.support.design.widget.TabLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/tab_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:tabMaxWidth="0dp"/>

1
Bu neredeyse var ama bazı sorunlar var. En bariz sorun, bazı cihazlarda (ve yavaş olanların çoğunda), düzenin nasıl değiştirildiğini ve değiştirildiğini görmenizdir.
Sotti

1
Başka bir sorun daha var, bu yaklaşım kaydırılabilir olup olmadığına karar vermek için TabLayout'un toplam genişliğini ölçer. Bu çok doğru değil. Kaydırılabilir modda TabLayout'un her iki kenara da ulaşmadığı durumlar vardır, ancak sekmedeki satır sayısını kötüye kullanma metnini küçültmeden sabit mod için yeterli yer yoktur (genellikle 2). Bu, sabit moddaki sekmelerin sabit bir genişliğe (screenWidth / numberOfTabs) sahipken kaydırılabilir modda metin + dolguları kaydırmalarının doğrudan bir sonucudur.
Sotti

1

İhtiyacınız olan tek şey aşağıdakileri TabLayout'unuza eklemektir

custom:tabGravity="fill"

Öyleyse sahip olacaksınız:

xmlns:custom="http://schemas.android.com/apk/res-auto"
<android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        custom:tabGravity="fill"
        />

Bu, yaratıcının istediği şey değil. Buradaki problem, sekmelerin asla kaydırılamayacağı ve ekrandaki boşluktan kurtulacağınızdır. Sekmeler metnini küçültmeye başlayacak ve sonunda iki satır olacak.
Sotti

1

Bunu aşağıdakileri kullanarak çözdüm

if(tabLayout_chemistCategory.getTabCount()<4)
    {
        tabLayout_chemistCategory.setTabGravity(TabLayout.GRAVITY_FILL);
    }else
    {
        tabLayout_chemistCategory.setTabMode(TabLayout.MODE_SCROLLABLE);

    }

1

Son çözümüm

class DynamicModeTabLayout : TabLayout {

    constructor(context: Context?) : super(context)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    override fun setupWithViewPager(viewPager: ViewPager?) {
        super.setupWithViewPager(viewPager)

        val view = getChildAt(0) ?: return
        view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
        val size = view.measuredWidth

        if (size > measuredWidth) {
            tabMode = MODE_SCROLLABLE
            tabGravity = GRAVITY_CENTER
        } else {
            tabMode = MODE_FIXED
            tabGravity = GRAVITY_FILL
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.