開發中遇到了一個問題,Tablayout設置下換線長度,看了點資料,分享給大家。
效果圖:
直接貼代碼(要在tabLayout添加完所有的tab后調用)
public void reflex(final TabLayout tabLayout){ //了解源碼得知 線的寬度是根據 tabView的寬度來設置的 tabLayout.post(new Runnable() { @Override public void run() { try { //拿到tabLayout的mTabStrip屬性 LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0); int dp10 = dip2px(tabLayout.getContext(), 10); for (int i = 0; i < mTabStrip.getChildCount(); i++) { View tabView = mTabStrip.getChildAt(i); //拿到tabView的mTextView屬性 tab的字數不固定一定用反射取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 = dp10; params.rightMargin = dp10; tabView.setLayoutParams(params); tabView.invalidate(); } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }); }
我的參考地址:http://blog.csdn.net/u013134391/article/details/70833903 (還是有缺點的,寬度不能比Title文字的寬度還小,最小是和它的寬度一樣)
在Android開發中,距離單位google推薦使用“dp”,文字大小的單位使用“sp”,(ps:IOS距離單位是“px”,文字單位是“pt”)
但是在實際開發中我們經常會遇到在java代碼中寫入距離單位,但是這樣的數字代表的是px。那我們要想辦法將“dp”轉換成屏幕像素點“px”。
public class DensityUtil { /** * 根據手機的分辨率從 dp 的單位 轉成為 px(像素) */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根據手機的分辨率從 px(像素) 的單位 轉成為 dp */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } }