在 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>();
在我的应用程序中,我有一个拥有工具栏(支持库)的片段。
我需要在那个收费栏中放置一个 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>();