欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

android TabLayout的指示器寬度問題

 更新時(shí)間:2018年04月09日 08:38:14   作者:CysionLiu  
這篇文章主要介紹了android TabLayout的指示器寬度問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

最近碰到一個(gè)需求,因?yàn)槭俏冶容^感興趣的TabLayout的,所以記錄一下吧。

  1. 產(chǎn)品需求:希望上部導(dǎo)航欄中的指示器寬度略大于文字寬度;
  2. 技術(shù)方案:TabLayout配合ViewPager;
  3. 問題分析: 原生TabLayout的指示器寬度等于每個(gè)tab的寬度,遠(yuǎn)大于 tab內(nèi)文字標(biāo)題的寬度。

原因分析:

TabLayout(TL)繼承自HorizontalScrollView,其只能添加一個(gè)子控件,這個(gè)子控件便是TL內(nèi)部私有類–SlidingTabStrip,其繼承自LinearLayout。指示器怎么加上的呢?便是在該類的onDraw方法中:

 @Override
public void draw(Canvas canvas) {
 super.draw(canvas);
 // Thick colored underline below the current selection
 if (mIndicatorLeft >= 0 && 
 mIndicatorRight > mIndicatorLeft) {
  canvas.drawRect(mIndicatorLeft, 
 mIndicatorRight, getHeight(), 
 mSelectedIndicatorPaint);
 }
}

即指示器是與這個(gè)SlidingTabStrip容器伴生存在,其寬度,由mIndicatorLeft和mIndicatorRight確定,而這二者,由tab的寬度決定,因?yàn)楸疚牟粫?huì)詳細(xì)描述TL的源碼,所以這里直接報(bào)出結(jié)論:這個(gè)指示器的寬度設(shè)置由tab寬度決定,而tab在mode=fix情況下,是符合linearLayout中weight控制的,因此,也沒法通過tab的寬度來影響指示器的寬度,比較囧的是,源碼中也沒給tab設(shè)置個(gè)Margin什么的,另外,源碼中也沒有暴露set等方法來改變指示器寬度,否則也不會(huì)有此問題了。

解決方案1:

百度的方案基本集中在反射,使用麻煩,有時(shí)還不好用。

這個(gè)的思路來自stackoverflow,大致過程是 由TL拿到其唯一的子類,即SlidingTabStrip,然后遍歷再拿到其各子View,然后為每個(gè)子View設(shè)置Margin,這就相當(dāng)于給每個(gè)tab設(shè)置margin,那么指示器的寬度自然也就跟著改變了。show code:

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

這種方式的限制是:最多只能讓指示器與tab等寬,無法繼續(xù)減小指示器的寬度。

解決方案2:

本方案屬于自定制指示器顯示,相對(duì)比較靈活,能解決方案1的tab等寬問題,但是其缺點(diǎn)是不能保留指示器的動(dòng)畫。具體過程:

TL中tab可以設(shè)置自定義view,方法是setCustomView(@Nullable View view) ,也就是說,完全可以不用TL中那套,直接自定義布局即可。在tab源碼的update方法中有這么一句:

 mCustomTextView = (TextView) custom.findViewById(android.R.id.text1);
 if (mCustomTextView != null) {
  mDefaultMaxLines = TextViewCompat.getMaxLines(mCustomTextView);
 }
 mCustomIconView = (ImageView) custom.findViewById(android.R.id.icon);

里面的android.R.id.text1和android.R.id.icon就是TL中tab能跟隨滑動(dòng)改變狀態(tài)的兩個(gè)view的id,我們自定義的時(shí)候可以讓對(duì)應(yīng)的view也這么設(shè)置id即可。而指示器,大可屏蔽原生TL的,直接在自定義布局的合適位置,加個(gè)view就行。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android編程基礎(chǔ)之Menu功能菜單設(shè)計(jì)實(shí)例

    Android編程基礎(chǔ)之Menu功能菜單設(shè)計(jì)實(shí)例

    這篇文章主要介紹了Android編程基礎(chǔ)之Menu功能菜單,結(jié)合實(shí)例形式分析了基本的Menu功能菜單原理、定義與響應(yīng)機(jī)制,需要的朋友可以參考下
    2016-10-10
  • Android實(shí)現(xiàn)自動(dòng)匹配關(guān)鍵字并且標(biāo)紅功能

    Android實(shí)現(xiàn)自動(dòng)匹配關(guān)鍵字并且標(biāo)紅功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動(dòng)匹配關(guān)鍵字并且標(biāo)紅功能,單關(guān)鍵字和多關(guān)鍵字進(jìn)行匹配,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android中庫項(xiàng)目的使用方法圖文介紹

    Android中庫項(xiàng)目的使用方法圖文介紹

    類似開發(fā)其他Java應(yīng)用一樣,我們可以將可復(fù)用的代碼,打成一個(gè)jar包,供所有需要的項(xiàng)目使用。這樣,可以解決很大一部分代碼復(fù)用的問題,本文將詳細(xì)介紹,需要了解的朋友可以參考下
    2012-12-12
  • Android仿京東手機(jī)端類別頁

    Android仿京東手機(jī)端類別頁

    這篇文章主要為大家詳細(xì)介紹了Android仿京東手機(jī)端類別頁,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Android自定義輪播圖效果

    Android自定義輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Android Studio提示inotify大小不足的解決辦法

    Android Studio提示inotify大小不足的解決辦法

    大家在使用Android Studio導(dǎo)入AOSP源碼的時(shí)候,可能會(huì)遇到inotify大小不足的問題,這篇文章就給大家介紹了怎么解決這個(gè)問題的方法,有需要的朋友們可以參考借鑒。
    2016-09-09
  • Flutter圖片與文件選擇器使用實(shí)例

    Flutter圖片與文件選擇器使用實(shí)例

    這篇文章主要為大家介紹了Flutter圖片與文件選擇器使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android、iOS和Windows Phone中的推送技術(shù)詳解

    Android、iOS和Windows Phone中的推送技術(shù)詳解

    這篇文章主要介紹了Android、iOS和Windows Phone中的推送技術(shù)詳解,推送技術(shù)的實(shí)現(xiàn)通常會(huì)使用服務(wù)端向客戶端推送消息的方式,也就是說客戶端通過用戶名、Key等ID注冊(cè)到服務(wù)端后,在服務(wù)端就可以將消息向所有活動(dòng)的客戶端發(fā)送,需要的朋友可以參考下
    2015-01-01
  • Android入門之TabHost與TabWidget實(shí)例解析

    Android入門之TabHost與TabWidget實(shí)例解析

    這篇文章主要介紹了Android入門之TabHost與TabWidget,對(duì)于Android初學(xué)者有一定的學(xué)習(xí)借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • 基于Rxjava實(shí)現(xiàn)輪詢定時(shí)器

    基于Rxjava實(shí)現(xiàn)輪詢定時(shí)器

    這篇文章主要為大家詳細(xì)介紹了基于Rxjava實(shí)現(xiàn)輪詢定時(shí)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06

最新評(píng)論