[置顶] Android 开发 Tip 11 -- TabLayout 设置文字大小一致
2017-05-08 17:00
666 查看
转载请注明出处:http://blog.csdn.net/crazy1235/article/details/71425135
使用TabLayout的时候,有些tab的文字比较多时,会出现与其他tab的文字大小不一致的情况!
![](https://oscdn.geek-share.com/Uploads/Images/Content/201705/ce689b3423165df26a62b145c890b859)
TabLayout 继承自 HorizontalScrollView
内部有几个关键的类:
SlidingTabStrip – TabLayout的唯一子View
Tab – 子item的实体类,包含text, icon, customView等属性
TabView – 每个Tab的布局
ViewPagerOnTabSelectedListener – – 监听滑动
TabLayoutOnPageChangeListener – 监听滑动
关于每个tab的文字大小的设置关键代码就在 TabView.onMeasure() 之中!
TabLayout内部设置了两种字体大小:
默认字体大小是14sp
多行时字体大小为12sp
结合onMeasure()来分析!
若使字体大小保持一致,一种方式是修改 mTabTextSize 这个默认字体大小;另外一种方式就是修改 mTabTextMultiLineSize 这个字体大小!
方式一:
定义一个style,把默认字体大小设置成12sp!
在TabLaout中引用
![](https://oscdn.geek-share.com/Uploads/Images/Content/201705/17595e3f0d38b4404090a25c0153af2e)
方式二:
把多行字体大小设置位于默认字体大小一致!
使用TabLayout的时候,有些tab的文字比较多时,会出现与其他tab的文字大小不一致的情况!
TabLayout 继承自 HorizontalScrollView
内部有几个关键的类:
SlidingTabStrip – TabLayout的唯一子View
Tab – 子item的实体类,包含text, icon, customView等属性
TabView – 每个Tab的布局
ViewPagerOnTabSelectedListener – – 监听滑动
TabLayoutOnPageChangeListener – 监听滑动
关于每个tab的文字大小的设置关键代码就在 TabView.onMeasure() 之中!
@Override public void onMeasure(final int origWidthMeasureSpec, final int origHeightMeasureSpec) { // ... // We need to switch the text size based on whether the text is spanning 2 lines or not if (mTextView != null) { final Resources res = getResources(); float textSize = mTabTextSize; int maxLines = mDefaultMaxLines; if (mIconView != null && mIconView.getVisibility() == VISIBLE) { // If the icon view is being displayed, we limit the text to 1 line maxLines = 1; } else if (mTextView != null && mTextView.getLineCount() > 1) { // Otherwise when we have text which wraps we reduce the text size textSize = mTabTextMultiLineSize; } final float curTextSize = mTextView.getTextSize(); final int curLineCount = mTextView.getLineCount(); final int curMaxLines = TextViewCompat.getMaxLines(mTextView); if (textSize != curTextSize || (curMaxLines >= 0 && maxLines != curMaxLines)) { // We've got a new text size and/or max lines... boolean updateTextView = true; if (mMode == MODE_FIXED && textSize > curTextSize && curLineCount == 1) { // If we're in fixed mode, going up in text size and currently have 1 line // then it's very easy to get into an infinite recursion. // To combat that we check to see if the change in text size // will cause a line count change. If so, abort the size change and stick // to the smaller size. final Layout layout = mTextView.getLayout(); if (layout == null || approximateLineWidth(layout, 0, textSize) > getMeasuredWidth() - getPaddingLeft() - getPaddingRight()) { updateTextView = false; } } if (updateTextView) { mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); mTextView.setMaxLines(maxLines); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } }
TabLayout内部设置了两种字体大小:
float mTabTextSize; float mTabTextMultiLineSize;
final TypedArray ta = context.obtainStyledAttributes(mTabTextAppearance, android.support.v7.appcompat.R.styleable.TextAppearance); try { mTabTextSize = ta.getDimensionPixelSize( android.support.v7.appcompat.R.styleable.TextAppearance_android_textSize, 0); mTabTextColors = ta.getColorStateList( android.support.v7.appcompat.R.styleable.TextAppearance_android_textColor); } finally { ta.recycle(); }
<style name="TextAppearance.Design.Tab" parent="TextAppearance.AppCompat.Button"> <item name="android:textSize">@dimen/design_tab_text_size</item> <item name="android:textColor">?android:textColorSecondary</item> <item name="textAllCaps">true</item> </style>
<dimen name="design_tab_text_size">14sp</dimen>
默认字体大小是14sp
final Resources res = getResources(); mTabTextMultiLineSize = res.getDimensionPixelSize(R.dimen.design_tab_text_size_2line);
<dimen name="design_tab_text_size_2line">12sp</dimen>
多行时字体大小为12sp
结合onMeasure()来分析!
若使字体大小保持一致,一种方式是修改 mTabTextSize 这个默认字体大小;另外一种方式就是修改 mTabTextMultiLineSize 这个字体大小!
方式一:
定义一个style,把默认字体大小设置成12sp!
<style name="TextAppearance.Design.Tab.Custom" parent="TextAppearance.AppCompat.Button"> <item name="android:textSize">12sp</item> <item name="android:textColor">?android:textColorSecondary</item> <item name="textAllCaps">true</item> </style>
在TabLaout中引用
<android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabTextAppearance="@style/TextAppearance.Design.Tab.Custom" />
方式二:
把多行字体大小设置位于默认字体大小一致!
<dimen name="design_tab_text_size" tools:ignore="PrivateResource">14sp</dimen>
相关文章推荐
- [置顶] Android开发之设置TabLayout下方下划线的宽度
- Android开发之TabLayout真正实现底部导航栏(可实现点击文字颜色图片切换)
- Android 中TabLayout如何设置字体大小!
- Android TabLayout 设置间距\字体大小的正确姿势
- [置顶] Android 开发 Tip 6 -- Spinner 文字 & icon 居中显示
- [置顶] Android开发之TabLayout的使用(实现三种常用的选项卡效果)
- android TabLayout 设置图标后,图标与文字之间间隔太大
- Android 设置TabLayout背景和字体大小
- Android TabLayout 设置Tab 字体大小
- Android中设置文字大小的定义类型
- [Android开发常见问题-9] android如何给PagerTitleStrip设置字体大小
- Android开发-01-不同分辨率的设备文字大小适配
- Android中设置半个屏幕大小且居中的按钮布局 (layout_weight属性)
- 解决Android当中GridView的Item子控件中有ImageView图片大小不一致问题,动态设置ImageView控件大小
- Android 如何根据设置文字大小动态计算TextView长度、动态设置Relativelayout布局
- Android 如何根据设置文字大小动态计算TextView长度、动态设置Relativelayout布局
- 50个Android开发技巧(11 为文字添加特效)
- Android开发笔记:设置android:gravity 和 android:layout_Gravity
- Android中设置半个屏幕大小且居中的按钮布局 (layout_weight属性)
- android 设置Spinner文字标题颜色 字体大小样式