2016-11-08 8 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

ありがとう@リオン、それは私のためにスクロール可能なTabLayout(tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE))を使用して働いた – Herman

+0

これは働いた。 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); 
     } 
    } 

を描くTabLayout内のプライベートクラスSlidingTabStripは、私がmIndicatorLeftとmIndicatorRightは何が必要であると考えているがあります。これらのフィールドは、同じクラスに設定されています

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 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 final SlidingTabStrip mTabStrip; 

完全に新しいTabLayoutを作成せずに必要なものを達成する方法はありません。あなたは、テキストよりも小さくなるようにストリップを必要としない場合

+0

=埋めるパディングは左右12に、インジケータはの終わりで停止2番目のタブタイトル。延長しなかった。その可能性がある場合、他の面を包む方法はありませんか? @StasMelnychenko –

+0

"重力を設定すると、塗りつぶしを左右に12度にする - ここではどのプロパティを意味しますか? TabLayout? ID = "@ + ID /タブ" アンドロイド:layout_toRightOf = "@ + ID/loginback" アンドロイド:layout_width = "match_parent" アンドロイドXML '

+0

:layout_height = "wrap_content" アンドロイド:背景= "@カラー/ colorPrimary" アンドロイド:layout_marginRight = "20dp" _ **アンドロイド:paddingRightは= "12dp" アプリ:tabGravity = "埋める" アンドロイド:paddingLeft =」 12dp "** アンドロイド:layout_marginLeft =" 40dp "/> ' –

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

それは両方のアンドロイドの7.0と4.4の仕事です – WhiteBanana

0

にパディングを設定するタイトルとしてタブインジケータをラップすることが可能です私はSDKのバージョンが必要わから注意していますが、あなたは直接それを行うことができますあなたのXMLファイル、app namespaceを使ってパディング属性を追加します。

ちょうどあなたのTabLayoutは次のようになります、あなたの親が彼の答えはあまりにもlayouが、その希望:)

おかげでレオンのためにあなたがxmlns:app="http://schemas.android.com/apk/res-auto"を移動することができます

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

達成するために私を導くことそれはXMLによるものです。

0

さまざまなソリューションで2時間試しましたが、どれも完全な効果がありません。
tabviewのパディングに問題があります。パディングをすべて0に設定しても、
異なるタブのパディングが異なるため、TextViewのテキストのサイズが異なります。

私は完全に解決したこのライブラリを見つけました。
https://github.com/H07000223/FlycoTabLayout
@Stas Melnychenkoは、TabLayoutを書き換えない限り、おそらくそれを行うことはできないと言っています。そして、このライブラリは、TabLayoutを書き換えます。

0

あなたはスタイルを使ってそれを行うことができます。

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

のstyles.xmlで:レイアウトXMLで

iは重力を設定

<style name="AppTabLayout" parent="Widget.Design.TabLayout"> 
    <item name="android:layout_marginLeft">40dp</item> 
    <item name="android:layout_marginRight">40dp</item> 
</style> 
関連する問題