在 Toolbar 中使用 SearchView(未设置为支持 ActionBar)

Using SearchView in Toolbar (not set as support ActionBar)

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

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

谁能帮帮我?

谢谢!

使用这样的东西:

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

我认为@Martijn00 的回答中有一些解决方案的暗示,但让我澄清一下。

由于您使用的是来自外部库的 SearchView,即 Support.v7,您需要使用 JavaCast<T>() 才能正确转换它。当您需要执行 Java 端对象转换时,需要 JavaCast<T>()。 Xamarin 的 bugzilla 上有一个 nice explanation here by Jon Pryor 为什么这是必要的。

无论如何,您的代码最终应该看起来像这样:

var item = toolbar.Menu.FindItem (Resource.Id.search);
var searchView = item.ActionView.JavaCast<SearchView>();