【问题标题】:Xamarin Forms with native Android Toolbar带有原生 Android 工具栏的 Xamarin 表单
【发布时间】: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 中定义的工具栏吗?怎么样?

【问题讨论】:

    标签: xamarin 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_width="match_parent"
        android:layout_height="wrap_content"
        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。

    【讨论】:

    • 谢谢,听起来它可以做我们需要做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多