Xamarin.Forms Android PopupMenu问题二

Xamarin.Forms Android PopupMenu问题二

在上一篇文章Xamarin.Android 使用PopupMenu遇到的问题文章中讲到了兼容Android 5.0及以下版本,但又带了一个新的问题。这个问题在所有Android版本App都会遇到,此时会抛出一个异常:

Java.Lang.RuntimeException: Failed to resolve attribute at index 6

经过多番尝试(在Xamarin.Android中调试,原生Android中调试)依然没能复现这个问题,因此我认为这个问题是Xamarin.Forms的一个bug。在微软支持York的帮助下,找到了一个Workaround,非常感谢York。

先来分析这个问题:

问题出在ListMenuItemView(源码),先看代码:

public ListMenuItemView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs); mContext = context; TypedArray a = context.obtainStyledAttributes( attrs, R.styleable.MenuView, defStyle, 0); mBackground = a.getDrawable(R.styleable.MenuView_android_itemBackground); mTextAppearance = a.getResourceId(R.styleable. MenuView_android_itemTextAppearance, -1); mPreserveIconSpacing = a.getBoolean( R.styleable.MenuView_android_preserveIconSpacing, false); mTextAppearanceContext = context; a.recycle(); }

ListMenuItemView在创建的时候,会去读取一个style:R.styleable.MenuView,由于无法找到这个style因此抛出了该异常。

在这个Workaround中,我们在创建PopupMenu的时候给它设置一个Style就能解决这个问题了。

Workaround:

  1. 首先在Styles.xml中创建一个MenuStyle

    <style name ="MyPopupMenu" parent="MainTheme"> <item name="android:popupBackground">#0F213F</item> <item name="android:disabledAlpha">0.5</item> </style>

  2. 然后在将创建的Style应用到PopupMenu

    Context wrapper = new Android.Support.V7.View.ContextThemeWrapper(context, Resource.Style.MyPopupMenu); PopupMenu popupMenu = new PopupMenu(wrapper, Control);

这样就能解决这个问题拉。

为什么一开始没又发现这个issue? 在解决兼容Android5.0的问题时,最开始使用Android.Widget.PopupMenu进行调试。在并没有清理代码的情况下,将PopupMenu换为Android.Support.V7.Widget.PopupMenu,然后直接编译运行成功了(此时若清理项目重新编译,该问题就会出现,所以我认为是Xamarin.Forms的一个Bug)。直到后来Xamarin.Forms.InputKit发布后,才发现该问题。

Android.Support.V7.Widget.PopupMenu源码

MenuPopupHelper源码

ListMenuItemView源码

原文地址:https://www.cnblogs.com/devin_zhou/p/9782557.html

时间: 2024-07-31 00:18:33

Xamarin.Forms Android PopupMenu问题二的相关文章

Xamarin.Forms学习之位图(二)

上篇文章分享了如何加载网络图片和PCL中的图片,所以今天继续分享关于如何加载平台的内嵌图片,在这之前说一下上篇文章开头的一个问题:为什么不能加载UWP项目,这是因为我升级了UWP的SDK,而Xamarin还没有支持到这个版本(我也不想用Xamarin来发UWP项目).还有就是园友问怎么知道哪些是平台特殊的API(Platform-specific API和文件操作),自认为呢,当你调用一个API的时候需要引用Xanmarin.IOS和Mono.Android或者说除了.NET的API都算是Pla

关于xamarin.forms Android创建文件与写文件 (ftp)

现在读写文件在Android原生态应该不在话下了.但是xamarin.forms应该如何用呢 1 //获取文件的名称含有后缀 2 string strName = Path.GetFileName(strPath); 3 strPath = "ftp://" + builder.UserName + ":" + builder.Password + "@" + builder.Host + strPath; 4 builder.AllPath =

Xamarin.Forms (Android制作启动画面)

http://blog.csdn.net/zapzqc/article/details/38496117 Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1.将启动画面的图片命名为:splash_screen.png,并拷贝到 Resources 文件夹下的相应 Drawable 文件夹中: 2.在其中的 Drawable 文件夹下创建 splashscreen.xml ,内容为: [html] view plain copy <?xml version="

C#-Xamarin的Android项目开发(二)——控件应用

相信我,这不是一篇吐槽文章.... 基础控件 Android的控件和控件样式非常特别,它是一种内联特别高的设计模式,换句话说,它是非常烂的设计.... 但在这种特别的关系里还是有一定的规律的,下面我们一起来看看控件的使用方式. 首先我们定义一个ImageButton,如下: <ImageButton android:src="@drawable/toolbar_upload_photo_normal" android:layout_gravity="right|cent

Xamarin.Forms&lt;四&gt; Android登录闪图

Xamarin.Forms Android闪图(适用于纯Android系统) 1.在Android.Resources.Drawable下添加好闪图的图片,命名为splashPicture. 2.在Android.Resources.Drawable新建一个splashscreen.xml的文件. 1 <?xml version="1.0" encoding="utf-8" ?> 2 <bitmap xmlns:android="http

张高兴的 Xamarin.Forms 开发笔记:为 Android 与 iOS 引入 UWP 风格的汉堡菜单 ( MasterDetailPage )

所谓 UWP 样式的汉堡菜单,我曾在"张高兴的 UWP 开发笔记:汉堡菜单进阶"里说过,也就是使用 Segoe MDL2 Assets 字体作为左侧 Icon,并且左侧使用填充颜色的矩形用来表示 ListView 的选中.如下图 但怎样通过 Xamarin.Forms ,将这一样式的汉堡菜单带入到 Android 与 iOS 中呢? 一.大纲-细节模式简介 讲代码前首先来说说这种导航模式,官方称"大纲-细节模式"(MasterDetail).左侧的汉堡菜单称为&qu

从零開始学Xamarin.Forms(二) 环境搭建、创建项目

一.环境搭建 Windows下环境搭建: 1.下载并安装jdk.Android SDK和NDK.当然还须要 VS2013 update 2(VS2010.VS2012均可)以上. a.  最新SDK. 下载地址:http://dl.google.com/android/android-sdk_r23-windows.zip b.  Android平台工具包(解压到SDK安装根文件夹下,产生文件夹platform-tools), 下载地址:https://dl-ssl.google.com/and

从零开始学Xamarin.Forms(二) 环境搭建、创建项目

一.环境搭建 Windows下环境搭建: 1.下载并安装jdk及android sdk: 2.下载Xamarin.VisualStudio,可以从官方下在线安装的,也可以下载3.0.54版本的离线安装包. 3.下载完毕运行安装程序,按照提示一步一步安装即可. Mac下环境搭建: 官方在线安装 二.创建Xamarin.Forms项目 1.新建项目,选择"Blank App(Xamarin.Forms Portable)" 创建完毕后,项目结构如下图: 2.更新程序集 由于默认的Xamar

张高兴的 Xamarin.Forms 开发笔记:Android 快捷方式 Shortcut 应用

一.Shortcut 简介 Shortcut 是 Android 7.1 (API Level 25) 的新特性,类似于苹果的 3D Touch ,但并不是压力感应,只是一种长按菜单.Shortcut 是受启动器限制的,也就是说国内大厂的定制系统大多数是不支持的,那些所谓的可以 pin 在桌面上的应用功能的快捷启动图标本质上就是 Shortcut . 二.Shortcut 在 Xamarin.Forms 中的实现分析 本文讨论的是动态 Shortcut 实现. 实现方式无非两种思路,一种 Nat