2016-11-08 62 views

回答

7

,这是可能的包装标签指示的标题设置填充到0

public void wrapTabIndicatorToTitle(TabLayout tabLayout, int externalMargin, int internalMargin) { 
     View tabStrip = tabLayout.getChildAt(0); 
     if (tabStrip instanceof ViewGroup) { 
      ViewGroup tabStripGroup = (ViewGroup) tabStrip; 
      int childCount = ((ViewGroup) tabStrip).getChildCount(); 
      for (int i = 0; i < childCount; i++) { 
       View tabView = tabStripGroup.getChildAt(i); 
       //set minimum width to 0 for instead for small texts, indicator is not wrapped as expected 
       tabView.setMinimumWidth(0); 
       // set padding to 0 for wrapping indicator as title 
       tabView.setPadding(0, tabView.getPaddingTop(), 0, tabView.getPaddingBottom()); 
       // setting custom margin between tabs 
       if (tabView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { 
        ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tabView.getLayoutParams(); 
        if (i == 0) { 
         // left 
         setMargin(layoutParams, externalMargin, internalMargin); 
        } else if (i == childCount - 1) { 
         // right 
         setMargin(layoutParams, internalMargin, externalMargin); 
        } else { 
         // internal 
         setMargin(layoutParams, internalMargin, internalMargin); 
        } 
       } 
      } 

      tabLayout.requestLayout(); 
     } 
} 

private void settingMargin(ViewGroup.MarginLayoutParams layoutParams, int start, int end) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     layoutParams.setMarginStart(start); 
     layoutParams.setMarginEnd(end); 
    } else { 
     layoutParams.leftMargin = start; 
     layoutParams.rightMargin = end; 
    } 
} 

Result

+0

谢谢@leon,它为我使用可滚动TabLayout(tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE)) – Herman

+0

这工作。请确保你也设置了以下XML格式:app:tabPadding =“0dp” – dazza5000

+0

对我来说工作正常 – malli

3

简短的回答是 “不”。这是解释。

有绘制指标

@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); 
     } 
    } 

我相信mIndicatorLeft和mIndicatorRight是你所需要的内TabLayout私有类SlidingTabStrip。这些字段在同一个班级设置:

private void setIndicatorPosition(int left, int right) { 
     if (left != mIndicatorLeft || right != mIndicatorRight) { 
      // If the indicator's left/right has changed, invalidate 
      mIndicatorLeft = left; 
      mIndicatorRight = right; 
      ViewCompat.postInvalidateOnAnimation(this); 
     } 
    } 

,其中左,右参数计算在下一方法:

private void updateIndicatorPosition() { 
     final View selectedTitle = getChildAt(mSelectedPosition); 
     int left, right; 
     if (selectedTitle != null && selectedTitle.getWidth() > 0) { 
      left = selectedTitle.getLeft(); 
      right = selectedTitle.getRight(); 
      if (mSelectionOffset > 0f && mSelectedPosition < getChildCount() - 1) { 
       // Draw the selection partway between the tabs 
       View nextTitle = getChildAt(mSelectedPosition + 1); 
       left = (int) (mSelectionOffset * nextTitle.getLeft() + 
         (1.0f - mSelectionOffset) * left); 
       right = (int) (mSelectionOffset * nextTitle.getRight() + 
         (1.0f - mSelectionOffset) * right); 
      } 
     } else { 
      left = right = -1; 
     } 
     setIndicatorPosition(left, right); 
    } 

而最糟糕的事情是,在TabLayout SlidingTabStrip领域是私人和决赛。

private final SlidingTabStrip mTabStrip; 

我不明白如何在不创建全新的TabLayout的情况下实现您所需要的功能。

+0

当我设置重力=填充和左填充和右至12,指示器停止在的结尾第二个标签标题。没有延长。如果有可能这样做,是不是有办法把其他方包起来呢? @StasMelnychenko –

+0

“当我将重力=填充和填充左右设置为12”时 - 您在此指的是哪些属性? TabLayout? –

+0

在XML '' –

8

enter image description here

如果您不需要带比文字更小,那么这应该工作:

public static void reduceMarginsInTabs(TabLayout tabLayout, int marginOffset) { 

    View tabStrip = tabLayout.getChildAt(0); 
    if (tabStrip instanceof ViewGroup) { 
     ViewGroup tabStripGroup = (ViewGroup) tabStrip; 
     for (int i = 0; i < ((ViewGroup) tabStrip).getChildCount(); i++) { 
      View tabView = tabStripGroup.getChildAt(i); 
      if (tabView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { 
       ((ViewGroup.MarginLayoutParams) tabView.getLayoutParams()).leftMargin = marginOffset; 
       ((ViewGroup.MarginLayoutParams) tabView.getLayoutParams()).rightMargin = marginOffset; 
      } 
     } 

     tabLayout.requestLayout(); 
    } 
} 

为了增加积分,您可以检查每个标题的文字大小。

+1

不适合我 –

+0

@Vishvadave感谢您的反馈,您能否提供有关您的设置的任何详细信息? –

+1

这是工作Android 7.0和4.4 – WhiteBanana

0

我注意到肯定的SDK版本需要的,但你可以直接在做您的XML文件,使用应用程序名称空间添加填充属性。

只是让你TabLayout看起来是这样的:

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

为你的父母也辣油你可以移动xmlns:app="http://schemas.android.com/apk/res-auto",但你的选择:)

感谢莱昂他的回答,导致我实现通过XML。

0

我试了2个小时的各种解决方案,但没有一个有完美的效果。
问题在于tabView的填充 - 即使我将其填充设置为全0,
不同的选项卡仍然具有不同的填充,因此TextView中的文本大小各不相同。

然后我发现这个库完全解决了它。
https://github.com/H07000223/FlycoTabLayout
正如@Stas Melnychenko所说,除非我们重写TabLayout,否则我们可能无法做到。而这个图书馆里重新写一个TabLayout ...

0

您可以使用样式做。

在布局XML:

<android.support.design.widget.TabLayout 
     android:id="@+id/tabs" 
     style="@style/AppTabLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

在styles.xml:

<style name="AppTabLayout" parent="Widget.Design.TabLayout"> 
    <item name="android:layout_marginLeft">40dp</item> 
    <item name="android:layout_marginRight">40dp</item> 
</style>