如何使用渲染器更改 Android 选项卡的背景颜色,同时使用自定义渲染器添加一些填充

2024-04-18

在我的应用程序中,我设置底部标签栏背景颜色,如下所示:

<Shell xmlns="http://xamarin.com/schemas/2014/forms" 
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
       x:Class="M.Views.AppShell"
       NavBarIsVisible="True"
       xmlns:local="clr-namespace:Memorise"
       BackgroundColor="{DynamicResource ShellBackgroundColor}"
       TabBarBackgroundColor="{DynamicResource TabBarBackgroundColor}" 
       TabBarDisabledColor="{DynamicResource TabBarDisabledColor}" 
       TabBarForegroundColor="{DynamicResource TabBarForegroundColor}" 
       TabBarTitleColor="{DynamicResource TabBarTitleColor}" 
       TabBarUnselectedColor="{DynamicResource TabBarUnselectedColor}"

我创建了一个自定义渲染器来向 Android 上的选项卡添加一些侧边距:

public class CustomShellRenderer : ShellRenderer
{
    public CustomShellRenderer(Context context)
        : base(context)
    {
    }

    protected override IShellBottomNavViewAppearanceTracker CreateBottomNavViewAppearanceTracker(ShellItem shellItem)
    {
        return new MarginedTabBarAppearance();
    }
}

public class MarginedTabBarAppearance : IShellBottomNavViewAppearanceTracker
{
    public void Dispose()
    {
    }

    public void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
    {
        if (App.devWidth == SIZE.L)
            bottomView.SetPadding(400, 0, 400, 0);
    }

    public void ResetAppearance(BottomNavigationView bottomView)
    {
    }
}

不幸的是,这也有一个副作用,它将选项卡的背景颜色设置为白色。

有谁知道我如何使用此渲染器并将背景颜色更改为与 DynamicResource ShellBackgroundColor 相同?

带有渲染器的代码被注释掉:

public class CustomShellRenderer : ShellRenderer
{
    public CustomShellRenderer(Context context)
        : base(context)
    {
    }

    //protected override IShellBottomNavViewAppearanceTracker CreateBottomNavViewAppearanceTracker(ShellItem shellItem)
    //{
    //    return new MarginedTabBarAppearance();
    //}
}

public class MarginedTabBarAppearance : IShellBottomNavViewAppearanceTracker
{
    public void Dispose()
    {
    }

    public void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
    {
        //if (App.devWidth == SIZE.L)
        //    bottomView.SetPadding(400, 0, 400, 0);
        //if (Application.Current.Resources["TabBarBackgroundColor"] is Xamarin.Forms.Color color1)
        //{
        //    bottomView.SetBackgroundColor(color1.ToAndroid());
        //}
    }

    public void ResetAppearance(BottomNavigationView bottomView)
    {
    }
}

带有注释掉的渲染器的选项卡栏:

** 带有渲染器的代码未注释掉:**

public class CustomShellRenderer : ShellRenderer
{
    public CustomShellRenderer(Context context)
        : base(context)
    {
    }

    protected override IShellBottomNavViewAppearanceTracker CreateBottomNavViewAppearanceTracker(ShellItem shellItem)
    {
        return new MarginedTabBarAppearance();
    }
}

public class MarginedTabBarAppearance : IShellBottomNavViewAppearanceTracker
{
    public void Dispose()
    {
    }

    public void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
    {
        if (App.devWidth == SIZE.L)
            bottomView.SetPadding(400, 0, 400, 0);
        if (Application.Current.Resources["TabBarBackgroundColor"] is Xamarin.Forms.Color color1)
        {
            bottomView.SetBackgroundColor(color1.ToAndroid());
        }
    }

    public void ResetAppearance(BottomNavigationView bottomView)
    {
    }
}

带有渲染器的选项卡栏未注释掉:

Mihail 建议的更新代码:

public class MarginedTabBarAppearance :    ShellBottomNavViewAppearanceTracker
{

public MarginedTabBarAppearance(IShellContext shellContext, ShellItem shellItem)
    : base(shellContext, shellItem)
{
}

public override void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
{
    base.SetAppearance(bottomView, appearance);

    bottomView.SetPadding(400, 0, 400, 0);

    if (Application.Current.Resources.ContainsKey("TabBarBackgroundColor") && 
        Application.Current.Resources["TabBarBackgroundColor"] is Color tabColor)
    {
        bottomView.SetBackgroundColor(tabColor.ToAndroid());
    }
}
}

In your SetAppearance方法,您可以像这样设置背景颜色:

bottomView.SetBackgroundColor(Android.Graphics.Color.Red);

但是,那SetBackgroundColor需要类型颜色Android.Graphics.Color我发现你想从 a 中获取颜色动态资源,这将返回一个Xamarin.Forms.Color。好处是这两种颜色类别都很容易转换,所以我们只需要获取当前的颜色类别值动态资源:

if (Application.Current.Resources["CustomTabBackgroundColor"] is Xamarin.Forms.Color color)
{
    bottomView.SetBackgroundColor(color.ToAndroid());
}

Here, CustomTabBackgroundColor是你的颜色的关键color.ToAndroid()执行 2 个类之间的转换(从 Xamarin 到 Android 类)。

UPDATE

由于问题的更新,我将补充一点,在这种情况下,样式/颜色重置的问题不是由于背景更改造成的,而是完全由于其他原因造成的。设置新视图外观的方式(return new MarginedTabBarAppearance();) 重置所有默认样式。由于我们正在实施一切界面并且不是源自基类,我们无法从已经预设的值中获取任何内容。为了解决这个问题,我们需要改变MarginedTabBarAppearance正在实施的类:

public class MarginedTabBarAppearance : ShellBottomNavViewAppearanceTracker
{
    public MarginedTabBarAppearance(IShellContext shellContext, ShellItem shellItem)
        : base(shellContext, shellItem)
    {
    }

    public override void SetAppearance(BottomNavigationView bottomView, IShellAppearanceElement appearance)
    {
        base.SetAppearance(bottomView, appearance);

        bottomView.SetPadding(400, 0, 400, 0);

        if (Application.Current.Resources.ContainsKey("TabBarBackgroundColor") && 
            Application.Current.Resources["TabBarBackgroundColor"] is Color tabColor)
        {
            bottomView.SetBackgroundColor(tabColor.ToAndroid());
        }
    }
}

此外,您还必须更改您的CreateBottomNavViewAppearanceTracker像这样的方法:

protected override IShellBottomNavViewAppearanceTracker CreateBottomNavViewAppearanceTracker(ShellItem shellItem)
{
    return new MarginedTabBarAppearance(this, shellItem);
}

这样,我们将采用我们已经设计好的所有内容,并且只需更改我们需要的内容即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用渲染器更改 Android 选项卡的背景颜色,同时使用自定义渲染器添加一些填充 的相关文章

随机推荐

  • 当 ExceptionMapper 创建响应时,未遍历 RestEasy 后处理拦截器链

    我正在使用 RestEasy 构建我的 Restful Web 服务 我已经实现了 ExceptionMappers 来准备特定的异常响应 我还实现了 MessageBodyWriterInterceptors 和几个 PostProces
  • EasyMock的使用方法

    期望似乎对我不起作用 package com jjs caf library client drafting import static org junit Assert import org easymock EasyMock impor
  • 用于从段落中删除所有属性的正则表达式

    我知道正则表达式通常不应该用于解析 html 内容 在我的特殊情况下 我需要它们 原因是 我使用 rte 编辑器 并且在粘贴到编辑器中时需要对段落属性进行一些替换 我有类似的东西 p text blah blah p 我需要删除所有属性 以
  • 数组中的clear方法

    我正在尝试创建一个清除方法来清除我拥有的数组 我已经看到使用清除方法是我所需要的 但我似乎无法使用它 list clear 我认为我必须做的 public void clear return doctors clear 顺便说一下 医生是一
  • 参数和属性之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 getAttribute 和 getParameter 之间的区别 https stackoverflow com questions 5243754 difference between getat
  • 当我的 MySQL 表更新时,如何收到电子邮件?

    您好 我想知道 MySQL 中是否有一种方法可以在 MySQL 表中添加一行时自动向自己发送电子邮件 实现这一目标的最佳方法是使用触发器和 cron 创建一个 通知队列 表 并在将行插入所需表时使用触发器填充该表 eg CREATE TAB
  • 如何在 R 中创建类似箱线图的分类散点图?

    有谁知道如何创建散点图R创建像这样的情节these http graphpad com support faq graph tip how can i make a barcolumn graph that also shows the i
  • 使用 zip4j 重命名 zip 中的文件

    我在用着zip4j http www lingala net zip4j download php1 3 1 在我的应用程序中压缩文件 现在我尝试重命名 zip 内的文件 而不必重命名文件本身 似乎有一种方法可以做到这一点 但它不起作用 我
  • 将当前日期设置为在 Bootstrap 日期选择器中选择

    我在用引导日期选择器 https github com eternicode bootstrap datepicker在我的代码中 如何在 JavaScript 中选择当前日期并将其显示为已选择 经过研究 这是我正在使用的代码 但当天没有显
  • 本地 JS 文件的 Typescript 声明文件

    当我们正在转换为 Typescript 的过程中 我正在尝试为工作中的 Javascript 文件添加类型 但是 我无法识别声明文件 这是我的文件结构 js Foo js typings Foo 索引 d ts index ts 包 jso
  • Symfony 4:JWT 和 Behat 的测试数据库

    我将 API Platform 2 1 与 Symfony 4 结合使用 并使用 LexikJWTAuthenticationBundle 进行身份验证 并使用 Behat 进行测试 我无法正确设置 这是到目前为止我的配置 Feature
  • 将使用 FPDF php 库创建的 PDF 保存在 MySQL blob 字段中

    我需要创建一个 pdf 文件fpdf http www fpdf org库并将其保存在我的 MySQL 数据库的 blob 字段中 问题是 当我尝试从 blob 字段检索文件并将其发送到浏览器进行下载时 下载的文件已损坏并且无法正确显示 如
  • 列出本地打印机

    我使用此例程列出计算机上安装的本地打印机 var p pointer hpi PRINTER INFO 2A hGlobal cardinal dwNeeded dwReturned DWORD bFlag boolean i dword
  • 是否有一个库可以将 java 命令行选项解析为关联数组?

    我需要一个可以采用以下形式的命令行选项的库java jar aaa a bbb b ccc c并返回一个数组 其值可以通过以下方式访问argsArray aaa argsArray bbb etc 有一些带有示例的库可以做到这一点吗 Jav
  • Lucene 上打开的文件太多错误

    我正在进行的项目是对一定数量的数据 长文本 建立索引 并将它们与每个时间间隔 大约 15 到 30 分钟 的单词列表进行比较 一段时间后 比如说第 35 轮 在开始索引第 36 轮的新数据集时 发生了此错误 ERROR 2011 06 01
  • 在 data.frame 中有效地定位分组常量列

    如何有效地从数据框中提取分组常量列 我在下面包含了一个 plyr 实现 以精确说明我想要做的事情 但它很慢 我怎样才能尽可能高效地做到这一点 理想情况下根本不分割数据框 base lt data frame group 1 1000 a s
  • 处理第三方API时正确的系统设计是什么?

    This 博客文章 http blog njoubert com 2010 12 structuring iphone apps design principles html朱伯特刚刚睁开了我的眼睛 我接触过很多 Java 和其他语言的设计
  • 比较字符串和整数会产生奇怪的结果

    我真的很困惑为什么这个操作有效 有人可以解释一下吗 test1 d85d1d81b25614a3504a3d5601a9cb2e test2 3581169b064f71be1630b321d3ca318f if test1 0 echo
  • 如何在 Haskell 中建模类层次结构?

    我是一名 C 开发人员 来自面向对象的世界 我从接口 类和类型层次结构的角度开始思考 由于 Haskell 缺乏面向对象 有时我发现自己陷入困境 无法想出用 Haskell 建模某些问题的方法 如何在 Haskell 中对涉及类层次结构的现
  • 如何使用渲染器更改 Android 选项卡的背景颜色,同时使用自定义渲染器添加一些填充

    在我的应用程序中 我设置底部标签栏背景颜色 如下所示