Android SlidingTabLayout选择Tab字体粗体



如何在SlidingTabLayout中选择tab的字体加粗?我发现了很多关于设置所选标签颜色的问题,但没有关于设置所选标签字体的问题。

您可以使用方法将TabLayout.OnTabSelectedListener添加到TabLayout中addOnTabSelectedListener(TabLayout.OnTabSelectedListener listener)。和重写方法,像这样:

@Override
public void onTabSelected(TabLayout.Tab tab) {
    LinearLayout tabLayout = (LinearLayout)((ViewGroup) mMainTabs.getChildAt(0)).getChildAt(tab.getPosition());
    TextView tabTextView = (TextView) tabLayout.getChildAt(1);
    tabTextView.setTypeface(tabTextView.getTypeface(), Typeface.BOLD);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
    LinearLayout tabLayout = (LinearLayout)((ViewGroup) mMainTabs.getChildAt(0)).getChildAt(tab.getPosition());
    TextView tabTextView = (TextView) tabLayout.getChildAt(1);
    tabTextView.setTypeface(tabTextView.getTypeface(), Typeface.NORMAL);
}
@Override
public void onTabReselected(TabLayout.Tab tab) { }

SlidingTabLayout.java中,您可以看到createDefaultTabView(Context Context)函数,这是您可以设置自定义字体的地方:

protected TextView createDefaultTabView(Context context) {
    TextView textView = new TextView(context);
    textView.setGravity(Gravity.CENTER);
    textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, TAB_VIEW_TEXT_SIZE_SP);
    textView.setTypeface(Typeface.DEFAULT_BOLD);
    textView.setTextColor(getResources().getColorStateList(R.color.main));
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // If we're running on Honeycomb or newer, then we can use the Theme's
        // selectableItemBackground to ensure that the View has a pressed state
        TypedValue outValue = new TypedValue();
        getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
                outValue, true);
        textView.setBackgroundResource(outValue.resourceId);
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        // If we're running on ICS or newer, enable all-caps to match the Action Bar tab style
        textView.setAllCaps(true);
    }
    int padding = (int) (TAB_VIEW_PADDING_DIPS * getResources().getDisplayMetrics().density);
    textView.setPadding(padding, padding, padding, padding);
    return textView;
}

setTypeface位于上面代码片段

的第5行

我最后是这样处理的:

onPageScrolled()方法中做如下修改:

View selectedTitle = mTabStrip.getChildAt(position);
        View leftOfSelected = mTabStrip.getChildAt(position-1);
        View rightOfSelected=null;
        if (position<=tabStripChildCount-1) {
            rightOfSelected = mTabStrip.getChildAt(position + 1);
        }
        if (selectedTitle != null) {
            TextView selectedText = (TextView) selectedTitle;
            TextView leftOfSelectedText = (TextView) leftOfSelected;
            TextView rightOfSelectedText = (TextView) rightOfSelected;
            if (position > 0 && position < tabStripChildCount - 1) {
                selectedText.setTypeface(Typeface.DEFAULT_BOLD);
                leftOfSelectedText.setTypeface(Typeface.DEFAULT);
                rightOfSelectedText.setTypeface(Typeface.DEFAULT);
            } else if (position == 0) {
                selectedText.setTypeface(Typeface.DEFAULT_BOLD);
                rightOfSelectedText.setTypeface(Typeface.DEFAULT);
            } else if (position == tabStripChildCount - 1) {
                selectedText.setTypeface(Typeface.DEFAULT_BOLD);
                leftOfSelectedText.setTypeface(Typeface.DEFAULT);
            }
        }

类似地,可以使用与上面相同的代码片段编辑scrollToTab()方法。所有你需要做的就是用selectedChild代替selectedTitle,用tabIndex代替position。如果你想要更好的UI响应,你也可以在onPageSelected()方法中做同样的事情。只要记住重新声明tabStripChildCount

干杯!

编辑:

随着TabLayout的引入,这变得更容易了。请参考Alex Zatsepin的回答

最新更新