带有原生 Android 工具栏的 Xamarin 表单
Posted
技术标签:
【中文标题】带有原生 Android 工具栏的 Xamarin 表单【英文标题】:Xamarin Forms with native Android Toolbar 【发布时间】:2018-03-26 02:03:14 【问题描述】:我们目前有一个在 Xamarin NativeUI 中设计的应用(共享代码和 Xamarin.android、Xamarin.UWP 等)正在确定 Xamain.Forms 是否足够成熟以过渡到。
我的一个核心问题是我们有一个非常自定义的操作栏/工具栏,它利用 Android 内置处理根据屏幕大小自动移动项目以溢出,具有溢出菜单和子菜单,自定义控件代替图标+文本.
我设法获得了自定义控件和硬编码溢出项。但我不确定如果不去本地,其余的是否可能。如果我们确实需要原生,我不确定您将如何使用 Xamarin.Forms 然后拥有 Xamarin.Android ActionBar。
另一个有趣的补充是我们必须支持 Android 4.3,这意味着使用支持库操作栏。
抱歉,这个问题有点漫无边际,但可以分为 2 个细节:
1) 使用 Xamarin.Forms 是否可以根据屏幕大小自动在工具栏中移入或移出溢出,类似于 Android 原生工具栏?
2) 如果使用 Xamarin.Forms,您可以使用 Xamarin.Android 中定义的工具栏吗?怎么样?
【问题讨论】:
【参考方案1】:除了@Steve Chadbourne 的回答之外,了解您在 XF 项目的 PCL 中使用的页面控件非常重要,如果您在客户端 android 项目中打开 MainActivity.cs
文件,默认情况下您可以找到类似的代码这个:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
protected override void OnCreate(Bundle bundle)
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
如您所见,定义了Toolbar
,您可以在客户端Android项目的Resources/layout
文件夹中找到它:
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_
android:layout_
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
默认情况下,此Toolbar
在 XF 中的某些页面类型控件中使用,例如 NavigationPage
。
对于 XF 的本机控制,我认为您可能没有注意到 Xamarin.Forms.ToolbarItem。它也呈现为Toolbar
,您可以将Order
属性设置为ToolbarItem
以指定要在主要、次要或默认工具栏表面上显示的项目。
对于自定义渲染器,可以参考这篇博客:Xamarin Forms - ContentPage with SearchBar in the Navigation bar。
不知道哪个是您的最佳选择,但我想对您的两个问题进行解释。 XF 就像一个 UI 工具包,它的所有控件都是基于原生 SDK 创建的,这意味着所有控件都被渲染为匹配的原生控件,因此可以在原生平台上使用。因此,如果 XF 控件在 Android 平台中呈现为 Toolbar
,则行为应该与原生 Android 中的普通 Toolbar
相同,但是就像我们自定义渲染器一样,当创建 XF 控件时, 许多属性在其代码中被硬编码,这可能会影响这里的结果。如果你遇到这样的问题,我建议阅读 Github 上的开源。
最后一个问题:
如果使用 Xamarin.Forms,是否可以使用 Xamarin.Android 中定义的工具栏?怎么样?
您可以使用自定义渲染器,也可以在原生客户端 Android 项目中直接修改 Toolbar.axml
中的代码。
【讨论】:
非常有用的信息,谢谢。我已经对 XF 工具栏进行了原型设计,但它不能做嵌套列表和原生 Android 工具栏可以做的其他一些事情,因此我很好奇如何恢复到原生的缺失功能。【参考方案2】:这应该可以在 Xamarin 表单中使用自定义渲染器实现。
您领先一步,因为您了解自己想要做什么以及如何在 Xamarin Native 中执行此操作。
Here is an overview on custom renderers.
Here is a link 是一个非常基本的 Android 导航页面自定义渲染器。您应该能够扩展它以包含您需要的原生 Android 代码。
请注意,如果您使用 app compat 来支持早期版本的 Android,您可能需要覆盖 NavigationPageRenderer。
【讨论】:
谢谢,听起来它可以做我们需要做的事情。以上是关于带有原生 Android 工具栏的 Xamarin 表单的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms 3.1.0+版本 Android 原生支持底部导航栏
Xamarin.Forms 3.1.0+版本 Android 原生支持底部导航栏啦
大叔也说Xamarin~Android篇~原生登陆与WebView的网站如何共享Session
如何从xamarin表单应用程序中的PCL项目访问android原生布局文件?