Xamarin.Forms:更改 TabbedPage 选项卡中的图标和文本大小
Xamarin.Forms: Change Icon & Text size in TabbedPage tabs
我正在 xaml
中使用 TabbedPage 开发标签。默认选项卡 图标和文本大小很大 所以我需要减小图标和文本的大小。下面是我的 main.xaml
代码,我在其中设置图标。
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TabbedApp">
<local:DairyTabs Icon="dairy" HeightRequest="10" WidthRequest="10" ></local:DairyTabs>
<local:Mykid Icon="kid" ></local:Mykid>
<local:Event Icon="about"></local:Event>
</TabbedPage>
这是标签页的第一页,我将标签页标题设为 Title="Dairy"
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
Title="Dairy">
<ContentPage.Content>
<StackLayout>
<Button x:Name="btnDemo" Text="Go for 2nd page"></Button>
</StackLayout>
</ContentPage.Content>
</ContentPage>
查看下面的屏幕截图,您可以在其中看到图标和标签文本。
在您的 Android 项目的 Resources/values/style.xml
文件中,您可以创建样式:
<style name="MyTabTextStyle" parent="Base.Widget.Design.TabLayout">
<item name="android:textSize">8sp</item>
</style>
然后在您的 Resources/layout/tabs.axml
文件中,您可以使用样式:
<android.support.design.widget.TabLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
... other attributes ...
app:tabTextAppearance="@style/MyTabTextStyle" />
至于图标,试试这个:
顺便说一下,我认为 "Dairy" 在您的应用中应该是 "Diary"
经过一些努力,我使用 TabbedPageRenderer
为 android 工作。使用 Custom_tab_layou.xaml
下面的 ImageView
& TetxtView
创建了自定义布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="41dp"
android:orientation="vertical">
<ImageView
android:id="@+id/icon"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="hello"
android:gravity="center"
android:textSize="11dp"
android:textColor="#00FF6F" />
</LinearLayout>
已创建 MyTabbedPageRenderer
class
public class MyTabbedPageRenderer : TabbedPageRenderer
{
private Dictionary<Int32, Int32> icons = new Dictionary<Int32, Int32>();
bool setup;
ViewPager pager;
TabLayout layout;
public MyTabbedPageRenderer(Context context) : base(context)
{
}
protected override void SetTabIcon(TabLayout.Tab tab, FileImageSource icon)
{
base.SetTabIcon(tab, icon);
tab.SetCustomView(Resource.Layout.Custom_tab_layou);
var imageview = tab.CustomView.FindViewById<ImageView>(Resource.Id.icon);
var tv = tab.CustomView.FindViewById<TextView>(Resource.Id.tv);
tv.SetText(tab.Text, TextView.BufferType.Normal);
imageview.SetBackgroundDrawable(tab.Icon);
ColorStateList colors2 = null;
if ((int)Build.VERSION.SdkInt >= 23)
colors2 = Resources.GetColorStateList(Resource.Color.icon_tab, Forms.Context.Theme);
else
colors2 = Resources.GetColorStateList(Resource.Color.icon_tab);
tv.SetTextColor(colors2);
}
//this is for changing text color of select tab
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (setup)
return;
if (e.PropertyName == "Renderer")
{
pager = (ViewPager)ViewGroup.GetChildAt(0);
layout = (TabLayout)ViewGroup.GetChildAt(1);
setup = true;
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 < layout.TabCount; i++)
{
var tab = layout.GetTabAt(i);
var icon = tab.Icon;
Android.Views.View view = GetChildAt(i);
if (view is TabLayout) layout = (TabLayout)view;
if (icon != null)
{
icon = Android.Support.V4.Graphics.Drawable.DrawableCompat.Wrap(icon);
Android.Support.V4.Graphics.Drawable.DrawableCompat.SetTintList(icon, colors);
}
}
}
}
}
在我的例子中,我真的很想跳过所有的自定义渲染器……而且许多实现似乎比应该做的要多得多。我还实现了 Font Awesome 图标,这看起来非常简单,但我发现的所有示例都将图标应用于标签,而没有使用标签页。经过一番折腾,我终于编译了这个,效果很好,不需要渲染器。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:IBMobile.Views"
xmlns:local2="clr-namespace:FontAwesome"
x:Class="IBMobile.Views.HomePage"
Visual="Material">
<ContentPage.IconImageSource>
<FontImageSource FontFamily="{StaticResource FontAwesomeSolid}" Glyph="{x:Static local2:IconFont.Home}" />
</ContentPage.IconImageSource>...
回答设置FontSize的问题:
字体图标是一种字体,因此它的设置与其他任何字体一样。示例:
<Button x:Name="btnEmail" Clicked="BtnEmail_Clicked" CommandParameter="{Binding email}" FontFamily="{StaticResource FontAwesomeSolid}" FontSize="Large" Text="{x:Static local2:IconFont.Envelope}" Grid.Column="3" Grid.Row="1" BackgroundColor="#007d5d" Margin="10" />
我正在 xaml
中使用 TabbedPage 开发标签。默认选项卡 图标和文本大小很大 所以我需要减小图标和文本的大小。下面是我的 main.xaml
代码,我在其中设置图标。
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:TabbedApp">
<local:DairyTabs Icon="dairy" HeightRequest="10" WidthRequest="10" ></local:DairyTabs>
<local:Mykid Icon="kid" ></local:Mykid>
<local:Event Icon="about"></local:Event>
</TabbedPage>
这是标签页的第一页,我将标签页标题设为 Title="Dairy"
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
Title="Dairy">
<ContentPage.Content>
<StackLayout>
<Button x:Name="btnDemo" Text="Go for 2nd page"></Button>
</StackLayout>
</ContentPage.Content>
</ContentPage>
查看下面的屏幕截图,您可以在其中看到图标和标签文本。
在您的 Android 项目的 Resources/values/style.xml
文件中,您可以创建样式:
<style name="MyTabTextStyle" parent="Base.Widget.Design.TabLayout">
<item name="android:textSize">8sp</item>
</style>
然后在您的 Resources/layout/tabs.axml
文件中,您可以使用样式:
<android.support.design.widget.TabLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
... other attributes ...
app:tabTextAppearance="@style/MyTabTextStyle" />
至于图标,试试这个:
顺便说一下,我认为 "Dairy" 在您的应用中应该是 "Diary"
经过一些努力,我使用 TabbedPageRenderer
为 android 工作。使用 Custom_tab_layou.xaml
ImageView
& TetxtView
创建了自定义布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="41dp"
android:orientation="vertical">
<ImageView
android:id="@+id/icon"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="hello"
android:gravity="center"
android:textSize="11dp"
android:textColor="#00FF6F" />
</LinearLayout>
已创建 MyTabbedPageRenderer
class
public class MyTabbedPageRenderer : TabbedPageRenderer
{
private Dictionary<Int32, Int32> icons = new Dictionary<Int32, Int32>();
bool setup;
ViewPager pager;
TabLayout layout;
public MyTabbedPageRenderer(Context context) : base(context)
{
}
protected override void SetTabIcon(TabLayout.Tab tab, FileImageSource icon)
{
base.SetTabIcon(tab, icon);
tab.SetCustomView(Resource.Layout.Custom_tab_layou);
var imageview = tab.CustomView.FindViewById<ImageView>(Resource.Id.icon);
var tv = tab.CustomView.FindViewById<TextView>(Resource.Id.tv);
tv.SetText(tab.Text, TextView.BufferType.Normal);
imageview.SetBackgroundDrawable(tab.Icon);
ColorStateList colors2 = null;
if ((int)Build.VERSION.SdkInt >= 23)
colors2 = Resources.GetColorStateList(Resource.Color.icon_tab, Forms.Context.Theme);
else
colors2 = Resources.GetColorStateList(Resource.Color.icon_tab);
tv.SetTextColor(colors2);
}
//this is for changing text color of select tab
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (setup)
return;
if (e.PropertyName == "Renderer")
{
pager = (ViewPager)ViewGroup.GetChildAt(0);
layout = (TabLayout)ViewGroup.GetChildAt(1);
setup = true;
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 < layout.TabCount; i++)
{
var tab = layout.GetTabAt(i);
var icon = tab.Icon;
Android.Views.View view = GetChildAt(i);
if (view is TabLayout) layout = (TabLayout)view;
if (icon != null)
{
icon = Android.Support.V4.Graphics.Drawable.DrawableCompat.Wrap(icon);
Android.Support.V4.Graphics.Drawable.DrawableCompat.SetTintList(icon, colors);
}
}
}
}
}
在我的例子中,我真的很想跳过所有的自定义渲染器……而且许多实现似乎比应该做的要多得多。我还实现了 Font Awesome 图标,这看起来非常简单,但我发现的所有示例都将图标应用于标签,而没有使用标签页。经过一番折腾,我终于编译了这个,效果很好,不需要渲染器。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:IBMobile.Views"
xmlns:local2="clr-namespace:FontAwesome"
x:Class="IBMobile.Views.HomePage"
Visual="Material">
<ContentPage.IconImageSource>
<FontImageSource FontFamily="{StaticResource FontAwesomeSolid}" Glyph="{x:Static local2:IconFont.Home}" />
</ContentPage.IconImageSource>...
回答设置FontSize的问题: 字体图标是一种字体,因此它的设置与其他任何字体一样。示例:
<Button x:Name="btnEmail" Clicked="BtnEmail_Clicked" CommandParameter="{Binding email}" FontFamily="{StaticResource FontAwesomeSolid}" FontSize="Large" Text="{x:Static local2:IconFont.Envelope}" Grid.Column="3" Grid.Row="1" BackgroundColor="#007d5d" Margin="10" />