在工具栏中使用SearchView(未设置为支持ActionBar)

时间:2015-07-24 10:44:52

标签: android xamarin xamarin.android android-toolbar

在我的应用程序中,我有一个拥有工具栏(支持库)的片段。

我需要在该收费栏中放置一个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。

任何人都可以帮助我?

谢谢!

2 个答案:

答案 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>();
    }