在我的应用程序中,我有一个拥有工具栏(支持库)的片段。
我需要在该收费栏中放置一个SearchView,这样我就创建了一个菜单xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
android:icon="@drawable/ic_magnify_white_24dp"
android:title="aaa"
android:orderInCategory="100"
app:showAsAction="ifRoom|withText"
app:actionViewClass="android.support.v7.widget.SearchView" />
以下是片段代码:
var toolbar = rootView.FindViewById<Android.Support.V7.Widget.Toolbar> (Resource.Id.toolbar);
toolbar.SetTitle (Resource.String.app_name);
toolbar.InflateMenu (Resource.Menu.Messages_list);
toolbar.MenuItemClick += Toolbar_MenuItemClick;
var item = toolbar.Menu.FindItem (Resource.Id.search).ActionView as Android.Support.V7.Widget.SearchView;
问题是 item 为空。这是非常奇怪的,因为调试器告诉我它真的是一个SearchView。
任何人都可以帮助我?
谢谢!
答案 0 :(得分:2)
我认为在@ Martijn00的回答中有一点点解决方案,但让我澄清一下。
由于您使用的是来自外部库的>>> print '\n'.join([etree.tostring(x) for x in matching_groups])
<group name="YYY common string">
<value val="42" description="the answer">
<text>What do you get if you multiple 6 by 9?</text>
</value>
</group>
,即Support.v7,因此您需要使用SearchView
才能正确投射它。需要执行Java端对象转换时需要JavaCast<T>()
。 Xamarin的bugzilla上有nice explanation here by Jon Pryor为什么这是必要的。
无论如何,你的代码应该看起来像这样:
JavaCast<T>()
答案 1 :(得分:1)
使用类似的东西:
public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater)
{
base.OnCreateOptionsMenu(menu, inflater);
inflater.Inflate(Resource.Menu.search, menu);
var searchMenu = menu.FindItem(Resource.Id.action_search);
var searchView = MenuItemCompat.GetActionView(searchMenu).JavaCast<SearchView>();
}