1. 程式人生 > >設定tablayout下劃線的寬度

設定tablayout下劃線的寬度

package com.kjt.app.activity.myaccount.MyNewStoreTemplate;

import android.content.res.Resources;
import android.support.design.widget.TabLayout;
import android.util.TypedValue;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.lang.reflect.Field;

/**
 * Created by xiayujia on 2017/6/20.
 */

public class TabLayoutIndicator {

    /**
     * 修改tablayout寬度
     * @param tabs
     * @param leftDip
     * @param rightDip
     */
    public static void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
        Class<?> tabLayout = tabs.getClass();
        Field tabStrip = null;
        try {
            tabStrip = tabLayout.getDeclaredField("mTabStrip");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        tabStrip.setAccessible(true);
        LinearLayout llTab = null;
        try {
            llTab = (LinearLayout) tabStrip.get(tabs);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
        int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());
        for (int i = 0; i < llTab.getChildCount(); i++) {
            View child = llTab.getChildAt(i);
            child.setPadding(0, 0, 0, 0);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
            params.leftMargin = left;
            params.rightMargin = right;
            child.setLayoutParams(params);
            child.invalidate();
        }
    }

    public static void setIndicator(TabLayout tabLayout) {
        try {
            //拿到tabLayout的mTabStrip屬性
            Field mTabStripField = tabLayout.getClass().getDeclaredField("mTabStrip");
            mTabStripField.setAccessible(true);

            LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(tabLayout);

//            int dp10 = SM.dip2px(getContext(), 10);

            for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                View tabView = mTabStrip.getChildAt(i);

                //拿到tabView的mTextView屬性
                Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
                mTextViewField.setAccessible(true);

                TextView mTextView = (TextView) mTextViewField.get(tabView);

                tabView.setPadding(0, 0, 0, 0);

                //因為我想要的效果是   字多寬線就多寬,所以測量mTextView的寬度
                int width = 0;
                width = mTextView.getWidth();
                if (width == 0) {
                    mTextView.measure(0, 0);
                    width = mTextView.getMeasuredWidth();
                }

                //設定tab左右間距為10dp  注意這裡不能使用Padding 因為原始碼中線的寬度是根據 tabView的寬度來設定的
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
                params.width = width ;
                params.leftMargin = 57;
                params.rightMargin = 57;
                tabView.setLayoutParams(params);

                tabView.invalidate();
            }

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

相關推薦

設定tablayout劃線寬度

package com.kjt.app.activity.myaccount.MyNewStoreTemplate; import android.content.res.Resources; import android.support.design.widget.Ta

修改TabLayout劃線寬度,以及在Api28遇到的問題—— tabLayout.getDeclaredField 空指標以及水波紋背景問題

在API28之前,我們修改TabLayout下劃線寬度,程式碼如下: /** * 設定tabLayout下劃線的寬 */ public static void setIndicator(TabLayout tabs, int leftDip, int rightD

設定tablayout劃線長度的方法

注意 最新的TabLayout 下劃線 mTabStrip 改為slidingTabIndicator public static void setIndicator(TabLayout tabs,

Android開發 設定tablayout劃線長度和內容保持一致

     廢話不多說,直接看一下效果吧:          改變下劃線和內容的長度一致可以給使用者更好的體驗,在這裡主要使用反射的方式,直接上程式碼吧 public static void reflex(f

原始碼解讀android 5.0控制元件TabLayout無法自定義劃線寬度問題!

首先我要說的是TabLayout這個控制元件非常好用,隨便搜尋下網上一大堆的關於TabLayout的用法,因此我也就不具體介紹TabLayout的使用了。 這裡我們談談為什麼TabLayout無法自定義下劃線寬度問題,廢話不多說,上原始碼: 首先找遍原始

修改TabLayout劃線寬度和文字和線的距離

1、寫個工具類 封裝: import android.content.res.Resources; import android.support.design.widget.TabLayout; import android.util.TypedValue; import android.view.View

TabLayout設置劃線(Indicator)寬度

csdn lac 獲取 .net print 原因 通過 nsh gin 再戰TabLayout之下劃線寬度 這周的需求搞定之後,想到之前有一個小瑕疵,反正沒什麽事,索性較量較量 如圖官方原版就是小瑕疵,反射版本就是最終 解決方案-Demo源碼 先講解決方案。直接貼

TabLayout設定劃線(Indicator)寬

因為TabLayout中系統是強制設定所有TabView的寬度為最寬那個TabView的寬度,而下劃線寬度即為TabView寬度,所以需要自定義下劃線寬度時,解決方法如下://瞭解原始碼得知:下劃線的寬度是根據TabView的寬度來設定的 tabLayout.post((

設定TabHost中的Tab標籤大小,字型的顏色,劃線的長度,使Tab之間可以有間隔

private void updateTab(final TabHost tabHost) { for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) { View view = tabHost.getT

Android TabLayout在與viewpager AppBarLayout一起使用時出現tab選中後劃線滑動緩慢,卡頓異常解決方案

今天早上剛測試發現的一個問題,之前沒有注意到,特別尷尬感覺,之前經常使用TabLayout和viewpager聯動切換碎片,異常的情況如下圖展示: 佈局程式碼如下: <?xml version="1.0" encoding="utf-8"?> <android.s

Android 如何使Tablayout內容和劃線長度相同?

我們在使用Tablayout選項卡控制元件的時候經常要根據專案需求做一些改動,比如如何使Tablayout內容和下劃線長度相同,類似頭條選項卡那種。通常我們的策略是通過反射的機制去改變Tabview的長度。下面直接貼程式碼: public void setIndicator(){

java字型設定,包括大小,顏色,加粗,劃線,對齊,斜體的設定

import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java

WPS文字設定奇偶頁首、劃線的方法步驟

這個問題困擾了我一天,問了無數人都不會,最後還是自己無意間網上查到一個點給了我靈感。 本文將解決以下問題: 1、頁首新增下劃線、設定下劃線的粗細? 2、如何將奇偶頁的頁首設定成不一樣的格式,例如: 單

uilabel 的相關處理 類富文字(自動換行,設定行高,同一個label多種顏色,給文字加劃線 首行縮排 等 等)

1.自動換行 UIFont *font=[UIFont systemFontOfSize:lableFont]; self.numberOfLines=0; self.lineBreakMode=NSLineBreakByWordWrapping; self.text=co

CSS劃線與文字間距,劃線粗細以及劃線顏色的設定

最開始的時候瞭解下劃線的屬性是:text-decoration:underline;1但是,很遺憾的是,對於設計做的下劃線用瀏覽器預設屬性樣式很難調整,使用這個屬性並不能調整下劃線與文字的間距,而且對於下劃線的顏色也不好調整,而使用<u></u>這個標

android:為TextView新增樣式——劃線,顏色,設定連結樣式及前背景色

實現下劃線及顏色設定: public class AtActivity extends Activity {LinearLayout ll;     /** Called when the activity is first created. */     @Overr

TextView使用SpannableString設定某部分文字的各種屬性(點選、顏色、劃線...)

public void setSpan(Object what, int start, int end, int flags) { super.setSpan(what, start, end, flags); } 這個方法的引數中的start 和 end 用

設定TextView部分文字劃線並響應點選事件(SpannableString)

實現效果 textview中改變《服務條款》的顏色、增加下劃線。 實現關鍵點: SpannableString的使用 SpannableString spanText=new SpannableString(getString(R.string.d

Latex設定字型大小,加粗,加劃線,變斜體

Latex 設定字型大小命令由小到大依次為:\tiny\scriptsize\footnotesize\small\normalsize\large\Large\LARGE\huge\Huge使用方法,例如:\large{這是大號字型}  加粗:\textbf{文字}數學模式

給文字設定劃線或者刪除線

在一些app,尤其是購物類的app中,通常我們會用到用線刪除原價的功能,用以下程式碼可簡單實現: /** * 設定刪除線 * * @param tv */