android - 自定义 Xamarin Forms 应用程序中选项卡项上的焦点状态外观,Android 实现
问题描述
在我的跨平台 Xamarin Forms 应用程序中,特别是在 Android 上,我希望能够自定义Xamarin.Forms.TabbedPage
. 特别是,我希望能够将栏中重点项目的背景从纯浅灰色裁剪圆(见下图)更改为不同的形状,例如绿色矩形框(实际形状并不重要)。
我知道如何根据状态更改项目的背景,我的问题是我找不到需要修改的样式或类似样式以更改TabbedPage
.
通常对于 Xamarin Forms 应用程序的 Android 应用程序项目,Tabbar.axml文件包含在Resources/Layout文件夹中,但我在此文件中所做的任何更改似乎都不适用于导航选项卡的外观。例如,我尝试添加以下行:
app:tabBackground="@drawable/background_states"
但我看不到任何迹象表明我的更改已被应用。
我也尝试过更广泛地确定要覆盖的 Android 样式,但无济于事。
任何人都可以向我推动正确的方向来解决我的问题吗?
解决方案
由于标签栏位于页面底部,因此该栏由BottomNavigationView
. 因此,我需要通过自定义TabbedPage
渲染器应用所需的背景样式。
在渲染器中,覆盖OnElementChanged
如下:
protected override void OnElementChanged(ElementChangedEventArgs<TabbedPage> e)
{
base.OnElementChanged(e);
if (e.NewElement == null) return;
// Identify first (only) bottom navigation view in collection of element children.
var bottomNavigationView = GetBottomNavigationView(ViewGroup);
// Apply a custom border style for the item background.
bottomNavigationView.ItemBackground =
Resources?.GetDrawable(Resource.Drawable.background_states, Context?.Theme);
}
whereGetBottomNavigationView
是遍历元素子树的方法,需要单独实现(为简洁起见,此处省略)。可绘制资源background_states
是用于根据状态应用不同背景的选择器。
推荐阅读
- python - 如何在循环内打印一次变量值
- python - 为什么我不能在这段代码中使用 pop() 函数删除列表中的元素?
- algorithm - 在图中查找所有唯一路径并返回最便宜的路径
- string - 如何在汇编语言中只打印字符串中的整数/数字
- react-admin - 根据需要调用 LoadingIndicator
- c - C程序中的类型转换失败
- java - 将 JSON 格式的 API 响应与 CSV 进行比较,两者都有数百万条记录,并且 csv 列名称与 JSON 字段不同
- android - android benchmark没有显示在日志文件中运行
- php - 在 Windows 服务器上安装 PHP v 8
- python - tkinter 单选按钮未在类中显示值