带有原生 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原生布局文件?

可以使用 Xamarin 为原生 iOS 和 Android 应用程序创建客户端 sdk 吗?

Xamarin 为原生开发者构建跨平台 sdk