2016-08-17 1 views
0

ich eine benutzerdefinierten TabLayout mit einem ViewPager gemacht und bin mit dem TabLayout in scrollbaren Modus:Tabs passen nicht mit tabmode auf Bildschirm = scrollbaren, auch mit einem benutzerdefinierten Tab Layout-

Ich brauche es als scrollbare zu sein die Anzahl der Tage, variieren, um so viele wie 15-20 können:

<com.example.project.recommendedapp.CustomScrollableTabLayout 
    android:id="@+id/tab_layout_movie" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimary" 
    android:elevation="6dp" 
    android:minHeight="?attr/actionBarSize" 
    app:tabGravity="fill" 
    app:tabMode="scrollable" 
    app:tabTextAppearance="?android:textAppearanceMedium" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

die benutzerdefinierte Klasse i als je eine andere ähnliche Frage verwendet: TabLayout not filling width when tabMode set to 'scrollable'

die benutzerdefinierte tablayout Klasse ist:

package com.example.project.recommendedapp; 

import android.content.Context; 
import android.graphics.Point; 
import android.support.design.widget.TabLayout; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.Display; 
import android.view.WindowManager; 

import java.lang.reflect.Field; 

public class CustomScrollableTabLayout extends TabLayout { 
    private Context mContext; 

    Point size; 

    public CustomScrollableTabLayout(Context context) { 
     super(context); 
     mContext=context; 
     size = new Point(); 
    } 

    public CustomScrollableTabLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext=context; 
     size = new Point(); 
    } 

    public CustomScrollableTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     mContext=context; 
     size = new Point(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     try { 
      if (getTabCount() == 0) { 
       return; 
      }else { 
       Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
       display.getSize(size); 
       int width = size.x; 

       Field field = TabLayout.class.getDeclaredField("mScrollableTabMinWidth"); 
       field.setAccessible(true); 
       field.set(this, (width/getTabCount())); 

       Log.d("FragmentCreate",String.valueOf(width/getTabCount())); 
      } 
     } catch (Exception e) { 
      Log.e("FragmentCreate","Error while setting width",e); 
     } 
    } 
} 

enter image description here

+0

Dies scheint zu sein, wie Google es will leider sein. – Sufian

+0

Sie könnten versuchen, Ihr 'TabLayout' in ein Layout zu setzen und die Schwerkraft auf center_horizontal zu setzen. – Sufian

Antwort

2

Hier ist meine Lösung.

0

Meine Lösung ist etwas anders, da ich den einen oben versuchte und es auf einigen Geräten nicht funktionierte. Ich habe bemerkt, dass, wenn alle Registerkarten auf dem Bildschirm sichtbar sind und wenn wir tabMode auf fixed setzen, TabLayout die angegebene Breite ausfüllt. Wenn wir scrollable, TabLayout verwenden, wird wie tabGravity auf center festgelegt.

So berechne ich die Summe der Breiten aller Registerkarten in TabLayout und wenn sie niedriger als gemessene Breite I befindet, gesetzt seine tabMode-MODE_FIXED, sonst zu MODE_SCROLLABLE:

public class CustomTabLayout extends TabLayout { 

    private static final String TAG = CustomTabLayout.class.getSimpleName(); 

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

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

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

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     if (getTabCount() == 0) 
      return; 
     try { 
      ViewGroup tabLayout = (ViewGroup)getChildAt(0); 
      int widthOfAllTabs = 0; 
      for (int i = 0; i < tabLayout.getChildCount(); i++) { 
       widthOfAllTabs += tabLayout.getChildAt(i).getMeasuredWidth(); 
      } 
      setTabMode(widthOfAllTabs <= getMeasuredWidth() ? MODE_FIXED : MODE_SCROLLABLE); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
Verwandte Themen