C# 将“位置”设置为“底部”时不显示选项卡页图标

C# 将“位置”设置为“底部”时不显示选项卡页图标,c#,android,xamarin.forms,tabbedpage,C#,Android,Xamarin.forms,Tabbedpage,我是Xamarin的初学者,尝试在我的应用程序中使用TabbedPage。当我使用TabbedPage并设置图标时,效果很好 然后我使用下面的链接将TabbedPage位置设置为bottom 但是,当我运行应用程序时,选项卡页面图标不可见,甚至宽度对于一个选项卡来说都太长 下面是我的XAML代码: <?xml version="1.0" encoding="utf-8" ?> <TabbedPage xmlns="//xamarin.com/schemas/2014/fo

我是Xamarin的初学者,尝试在我的应用程序中使用TabbedPage。当我使用TabbedPage并设置图标时,效果很好

然后我使用下面的链接将TabbedPage位置设置为bottom

但是,当我运行应用程序时,选项卡页面图标不可见,甚至宽度对于一个选项卡来说都太长

下面是我的XAML代码:

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="//xamarin.com/schemas/2014/forms"
        xmlns:x="//schemas.microsoft.com/winfx/2009/xaml"
        xmlns:views="clr-namespace:App5.Views"
        x:Class="App5.Views.MainPage"
        BarBackgroundColor="LightYellow"
        BarTextColor="Black"
        xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
        android:TabbedPage.ToolbarPlacement="Bottom"
        android:TabbedPage.BarItemColor="Black"
        android:TabbedPage.BarSelectedItemColor="Red">
<TabbedPage.Children>
    <NavigationPage Title="Tab1" Icon="Tab1.png">
        <x:Arguments>
            <views:ItemsPage />
        </x:Arguments>
    </NavigationPage>
    <NavigationPage Title="Tab2" Icon="Tab2.png">
        <x:Arguments>
            <views:AboutPage />
        </x:Arguments>
    </NavigationPage>
    <NavigationPage Title="Tab3" Icon="Tab3.png">
        <x:Arguments>
            <views:AboutPage />
        </x:Arguments>
    </NavigationPage>
    <NavigationPage Title="Tab4" Icon="Tab4.png">
    <x:Arguments>
        <views:AboutPage />
    </x:Arguments>
</NavigationPage>
</TabbedPage.Children>


有人能帮我一下吗?

我想在选择标签时,标签之间的空间可能有问题。选择选项卡时,需要禁用缩放效果

创建自定义标签阅读器以禁用Android的缩放效果

BottomTabbedPageRenderer.cs

  [assembly: ExportRenderer(typeof(TabbedPage), typeof(BottomTabbedPageRenderer))]
namespace Droid.Renderer

{
    public class BottomTabbedPageRenderer : TabbedPageRenderer
    {
    public BottomTabbedPageRenderer(Context context) : base(context)
    {
    }

    protected override void OnLayout(bool changed, int l, int t, int r, int b)
    {
        base.OnLayout(changed, l, t, r, b);
        try
        {
            var children = GetAllChildViews(ViewGroup);

            if (children.SingleOrDefault(x => x is BottomNavigationView) is BottomNavigationView bottomNav)
            {

                try
                {
                    if (!(bottomNav.GetChildAt(0) is BottomNavigationMenuView menuView))
                    {
                        System.Diagnostics.Debug.WriteLine("Unable to find BottomNavigationMenuView");
                        return;
                    }


                    var shiftMode = menuView.Class.GetDeclaredField("mShiftingMode");

                    shiftMode.Accessible = true;
                    shiftMode.SetBoolean(menuView, false);
                    shiftMode.Accessible = false;
                    shiftMode.Dispose();


                    for (int i = 0; i < menuView.ChildCount; i++)
                    {
                        if (!(menuView.GetChildAt(i) is BottomNavigationItemView item))
                            continue;

                        item.SetShiftingMode(false);
                        item.SetChecked(item.ItemData.IsChecked);

                    }

                    menuView.UpdateMenuView();
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine($"Unable to set shift mode: {ex}");
                }

            }

        }
        catch (Exception e)
        {
            Console.WriteLine($"Error setting ShiftMode: {e}");
        }
    }

    private List<View> GetAllChildViews(View view)
    {
        if (!(view is ViewGroup group))
        {
            return new List<View> { view };
        }

        var result = new List<View>();

        for (int i = 0; i < group.ChildCount; i++)
        {
            var child = group.GetChildAt(i);

            var childList = new List<View> { child };
            childList.AddRange(GetAllChildViews(child));

            result.AddRange(childList);
        }

        return result.Distinct().ToList();
    }
}
}
[程序集:ExportRenderer(typeof(TabbedPage)、typeof(BottomTabbedPageRenderer))]
名称空间Droid.Renderer
{
公共类BottomTabbedPageRenderer:TabbedPageRenderer
{
public BottomTabbedPageRenderer(上下文):基本(上下文)
{
}
受保护覆盖仅限无效布局(布尔值已更改、整数l、整数t、整数r、整数b)
{
仅基础布局(已更改,l、t、r、b);
尝试
{
var children=GetAllChildViews(视图组);
if(children.SingleOrDefault(x=>x是BottomNavigationView)是BottomNavigationView bottomNav)
{
尝试
{
如果(!(bottomNav.GetChildAt(0)是BottomNavigationMenuView menuView))
{
System.Diagnostics.Debug.WriteLine(“无法找到BottomNavigationMenuView”);
返回;
}
var shiftMode=menuView.Class.GetDeclaredField(“MSShift模式”);
shiftMode.Accessible=true;
shiftMode.SetBoolean(菜单视图,false);
shiftMode.Accessible=false;
shiftMode.Dispose();
for(int i=0;i
MyTabPage.xaml

<?xml version="1.0" encoding="UTF-8"?>
<TabbedPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    BarBackgroundColor="LightYellow"
    BarTextColor="Black"
    xmlns:views="clr-namespace:Demo"
    xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
    android:TabbedPage.ToolbarPlacement="Bottom"
    x:Class="Demo.MyTabPage">
    <TabbedPage.Children>
        <NavigationPage
            Title="Tab1"
            Icon="dashboard_selected.png">
            <x:Arguments>
                <views:MainPage />
            </x:Arguments>
        </NavigationPage>
        <NavigationPage
            Title="Tab2"
            Icon="dashboard.png">
            <x:Arguments>
                <views:MainPage />
            </x:Arguments>
        </NavigationPage>
        <NavigationPage
            Title="Tab3"
            Icon="error_alert.png">
            <x:Arguments>
                <views:MainPage />
            </x:Arguments>
        </NavigationPage>
        <NavigationPage
            Title="Tab4"
            Icon="menu.png">
            <x:Arguments>
                <views:MainPage />
            </x:Arguments>
        </NavigationPage>
    </TabbedPage.Children>
</TabbedPage>

我把所有的图像资源放在drawable文件夹中,xhdpi、mdpi、xxhdpi、xxxhdpi的名称都相同,在我的例子中,它工作得很好


正如Jaymin的回答评论中提到的@User5590和@Jaymin,它与tabbar图标的分辨率有关(我不需要实现自定义渲染器)。以下是我所做的:

  • 转到此处,在“源”部分选择“图像”并上载所需的选项卡图标:
  • 从左侧面板中选择选项卡图标的名称:
  • 然后单击蓝色图标下载zip文件:

  • 现在我们在zip文件中有了所有分辨率的选项卡图标,请将它们放在Android项目的corespondent文件夹中。例如,将zip文件的drawable xxxhdpi文件夹中的tab_icon.png移动到Android项目中的同一文件夹中
  • 注意:确保设置每个页面的
    标题
    图标
    属性,例如在第一页的XAML中:

    Icon=“tab\u Icon.png”

    最后的结果是:


    谢谢你的回答。我已经实现了同样的功能,并且正确设置了宽度,但是你对图标也有什么想法,因为它们仍然不可见删除
    android:TabbedPage.BarItemColor=“Black”android:TabbedPage.BarSelectedItemColor=“Red”>
    和try@User5590,我已经使用了您的XAML代码并尝试了。它正在工作。我已经删除了android:TabbedPage.BarItemColor=“Black”android:TabbedPage.BarSelectedItemColor=“Red”>
    ,工作正常。请检查我的更新答案。谢谢你的回答,让我从我这边检查,并会让你知道结果。我尝试了,但仍然是相同的结果。你能将你的演示解决方案作为zip分享吗?