如何在Xamarin Forms Android中修改TabbedPage标题的选中/未选中颜色
实现Xamarin Forms TabbedPage Android端标签标题颜色随选中状态变化
你已经搞定了图标颜色的差异化,要让标题也跟着变颜色其实很简单,只需要在你现有的Android渲染器代码里加几行处理Tab标题TextView的逻辑就行,直接复用你已经定义好的颜色选择器就可以。
修改后的完整渲染器代码
public class MyTabbedPageRenderer: TabbedPageRenderer { bool setup; ViewPager viewPager; TabLayout tabLayout; protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); if (setup) return; if (e.PropertyName == "Renderer") { viewPager = (ViewPager)ViewGroup.GetChildAt(0); tabLayout = (TabLayout)ViewGroup.GetChildAt(1); setup = true; // 复用你已有的颜色选择器,也可以单独新建一个text_tab.xml ColorStateList colors = null; if ((int)Build.VERSION.SdkInt >= 23) { colors = Resources.GetColorStateList(Resource.Color.icon_tab, Forms.Context.Theme); } else { colors = Resources.GetColorStateList(Resource.Color.icon_tab); } for (int i = 0; i < tabLayout.TabCount; i++) { var tab = tabLayout.GetTabAt(i); // 处理图标颜色(你原来的逻辑) var icon = tab.Icon; if (icon != null) { icon = Android.Support.V4.Graphics.Drawable.DrawableCompat.Wrap(icon); Android.Support.V4.Graphics.Drawable.DrawableCompat.SetTintList(icon, colors); } // 新增:处理标题颜色 var tabView = tabLayout.GetChildAt(i); if (tabView != null) { // 找到Tab里的标题TextView(一般是AppCompatTextView) var titleTextView = tabView.FindViewById<Android.Support.V7.Widget.AppCompatTextView>(Resource.Id.tab_text); if (titleTextView != null) { titleTextView.SetTextColor(colors); } } } } } }
关键说明
- 复用颜色选择器:我直接用了你已经在
Resources/Color/icon_tab.xml里定义的规则,如果标题需要不同的颜色,你可以复制一份改名为text_tab.xml,修改里面的颜色值,然后在代码里换成Resource.Color.text_tab就行。 - 获取标题TextView:TabLayout的每个Tab对应的View里,标题TextView的默认ID是
tab_text(来自Android Support库的TabLayout布局),所以用FindViewById就能定位到它。 - 版本兼容:颜色选择器的获取逻辑和你原来处理图标的一致,兼顾了Android 6.0(API23)及以上的主题适配。
验证效果
修改完代码后,重新编译运行Android项目,就能看到标签标题和图标一样,选中时显示#2196F3,未选中时显示#b2b2b2,和iOS端的效果保持一致啦。
内容的提问来源于stack exchange,提问作者iamsophia
相关产品推荐
相关产品推荐

