![](/img/trans.png)
[英]How to customize the size of the bar in a TabbedPage? [XAMARIN.FORMS]
[英]How to change icon and text size in Shell TabbedPage app, Xamarin forms
我有一個帶有 5 個標簽的簡單 shell 應用程序。 我想根據應用屏幕大小更改圖標和文本大小。
<?xml version="1.0" encoding="UTF-8"?>
<Shell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:Ingly.Views"
Title="App title"
x:Class="MyApp.AppShell"
Shell.NavBarIsVisible="False">
<TabBar>
<ShellContent Title="Store" Icon="icon_store.png" Route="AboutPage" ContentTemplate="{DataTemplate local:AboutPage}" />
<ShellContent Title="Challenge" Icon="icon_challenge.png" ContentTemplate="{DataTemplate local:ItemsPage}" />
<ShellContent Title="Learn" Icon="icon_learn.png" ContentTemplate="{DataTemplate local:ItemsPage}" />
<ShellContent Title="Words" Icon="icon_words.png" ContentTemplate="{DataTemplate local:ItemsPage}" />
<ShellContent class="ss" Title="Profile" Icon="icon_profile.png" ContentTemplate="{DataTemplate local:ItemsPage}" />
</TabBar>
</Shell>
我想根據應用屏幕大小更改圖標和文本大小。 從第二個屏幕截圖中可以看出,在較小的屏幕上幾乎不可能閱讀標簽的標題。
Android:在 Android 上,您可以使用 LayerDrawable 設置 BottomNavigationView 的背景。 在這種情況下,我根據選擇的選項卡項計算了底線背景的 position 和寬度,然后將其設置為 BottomNavigationView 背景。
public class ExtendedTabbedPageRenderer : TabbedPageRenderer
{
Xamarin.Forms.TabbedPage tabbedPage;
BottomNavigationView bottomNavigationView;
private bool firstTime = true;
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.TabbedPage> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
tabbedPage = e.NewElement as ExtendedTabbedPage;
bottomNavigationView = (GetChildAt(0) as Android.Widget.RelativeLayout).GetChildAt(1) as BottomNavigationView;
bottomNavigationView.NavigationItemSelected += BottomNavigationView_NavigationItemSelected;
}
}
protected override void OnLayout(bool changed, int l, int t, int r, int b)
{
base.OnLayout(changed, l, t, r, b);
if (firstTime && bottomNavigationView != null)
{
for (int i = 0; i < Element.Children.Count; i++)
{
var item = bottomNavigationView.Menu.GetItem(i);
if (bottomNavigationView.SelectedItemId == item.ItemId)
{
SetupBottomNavigationView(item);
break;
}
}
firstTime = false;
}
}
void BottomNavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
{
SetupBottomNavigationView(e.Item);
this.OnNavigationItemSelected(e.Item);
}
//Adding line view
void SetupBottomNavigationView(IMenuItem item)
{
int lineBottomOffset = 8;
int lineWidth = 4;
int itemHeight = bottomNavigationView.Height - lineBottomOffset;
int itemWidth = (bottomNavigationView.Width / Element.Children.Count);
int leftOffset = item.ItemId * itemWidth;
int rightOffset = itemWidth * (Element.Children.Count - (item.ItemId + 1));
GradientDrawable bottomLine = new GradientDrawable();
bottomLine.SetShape(ShapeType.Line);
bottomLine.SetStroke(lineWidth, Xamarin.Forms.Color.DarkGray.ToAndroid());
var layerDrawable = new LayerDrawable(new Drawable[] { bottomLine });
layerDrawable.SetLayerInset(0, leftOffset, itemHeight, rightOffset, 0);
bottomNavigationView.SetBackground(layerDrawable);
}
}
有關更多詳細信息,請點擊此鏈接https://xamgirl.com/extending-tabbedpage-in-xamarin-forms/
From Xamarin.Forms Shell Custom Renderers , change tab bar text size and change icon by shell custom render:
[assembly: ExportRenderer(typeof(AppShell), typeof(MyShellRenderer))]
namespace shellicon.Droid
{
public class MyShellRenderer : ShellRenderer
{
public MyShellRenderer(Context context) : base(context)
{
}
protected override IShellBottomNavViewAppearanceTracker CreateBottomNavViewAppearanceTracker(ShellItem shellItem)
{
return new CustomBottomNavAppearance();
}
}
public class CustomBottomNavAppearance : IShellBottomNavViewAppearanceTracker
{
public void Dispose()
{
}
public void ResetAppearance(BottomNavigationView bottomView)
{
throw new NotImplementedException();
}
public void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
{
var instance = MainActivity.mactivity;
int width = instance.width;
if(width>??)
{
var bottomNavMenuView = bottomView.GetChildAt(0) as BottomNavigationMenuView;
for (int i = 0; i < bottomNavMenuView.ChildCount; i++)
{
var item = bottomNavMenuView.GetChildAt(i) as BottomNavigationItemView;
var itemicon = item.GetChildAt(0);
var itemTitle = item.GetChildAt(1);
var IconImageView = (ImageView)itemicon;
var smallTextView = ((TextView)((BaselineLayout)itemTitle).GetChildAt(0));
var largeTextView = ((TextView)((BaselineLayout)itemTitle).GetChildAt(1));
IconImageView.SetImageResource(Resource.Drawable.check);
smallTextView.TextSize = 18;
largeTextView.TextSize = 18;
}
}
}
}
在 Mainactivity.cs 中獲取當前屏幕尺寸:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static MainActivity mactivity;
public int width { get; set; }
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
var metrics = Resources.DisplayMetrics;
width = metrics.WidthPixels;
mactivity = this;
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
在 Android 項目的Resources/values文件夾中創建一個新文件dimens.xml如果它不存在。 然后添加以下 XML 來覆蓋文本在激活和非激活時的大小:
<resources xmlns:tools="http://schemas.android.com/tools">
<dimen name="design_bottom_navigation_text_size" tools:override="true">12sp</dimen>
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">12sp</dimen>
</resources>
您必須使用 Android API 版本 28 及更高版本。
更多信息可以在這里找到: https://montemagno.com/control-text-size-on-android-bottom-navigation/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.