Xamarin Android 操作栏中的搜索视图为空

Xamarin Android search view in action bar is null

我遇到一个问题,其中包含 SearchView 的 MenuItem 的 ActionView 属性 始终为空。我的目标是 API 级别 22,我试图只使用 Android.Support.V7.Widget 包中的内置 SearchView class,并且我正在使用 FragmentActivity。

需要注意的一件事是,在我的应用程序中,我的操作栏工作正常,我可以毫无问题地设置其他菜单项。

对我来说,当我展开菜单时,我得到了搜索菜单项,但它的 ActionView 属性 始终为空。当我使用 MenuItemCompat.GetActionView 方法时,我得到了相同的行为。

此外,在应用程序中我根本看不到搜索图标,而是看到了带有 "Search" 标签作为选项的操作栏上下文菜单。

有谁知道我做错了什么吗?我的代码片段如下。

menu.xml

<?xml version="1.0" encoding="UTF-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:way="http://schemas.android.com/apk/res-auto" >
    <item 
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        android:title="Search"
        way:showAsAction="always|collapseActionView"
        way:actionViewClass="Android.Support.V7.Widget.SearchView" />
</menu>

MyActivity.cs

namespace AndroidApp
{
    [Activity (Label = "WAY", Theme = "@style/AppTheme")]
    public class TabActivity : FragmentActivity, ActionBar.ITabListener, ViewPager.IOnPageChangeListener
    {
        private SearchView SearchView;


        [A bunch of un-realted code]

        public override bool OnCreateOptionsMenu (IMenu menu)
        {
            MenuInflater.Inflate(this.CurrentMenuId, menu);

            IMenuItem item = menu.FindItem (Resource.Id.action_search);
            var sItem = MenuItemCompat.GetActionView (item);
            this.SearchView = sItem.JavaCast<SearchView> ();

            return true;
        }

        [More un-related code]
    }
}

这里是在黑暗中拍摄,尝试将您的命名空间更改为小写。

所以来自:

way:actionViewClass="Android.Support.V7.Widget.SearchView"

收件人:

way:actionViewClass="android.support.v7.widget.SearchView"

我终于弄清楚了我的问题。问题是我试图使用 Support V7 包中的 SearchView,但我的 API 级别设置为 22。将我的代码更改为以下代码解决了问题。

menu.xml

<?xml version="1.0" encoding="UTF-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:id="@+id/action_search"
        android:icon="@drawable/actionbar_button_search"
        android:title="Search"
        android:showAsAction="always"
        android:actionViewClass="android.widget.SearchView" />
</menu>

MyActivity.cs

namespace AndroidApp
{
    [Activity (Label = "WAY", Theme = "@style/AppTheme")]
    public class TabActivity : FragmentActivity, ActionBar.ITabListener, ViewPager.IOnPageChangeListener
    {
        private SearchView SearchView;


        [A bunch of un-realted code]

        public override bool OnCreateOptionsMenu (IMenu menu)
        {
            MenuInflater.Inflate(this.CurrentMenuId, menu);

            IMenuItem item = menu.FindItem (Resource.Id.action_search);
            this.SearchView = item.ActionView.JavaCast<Android.Widget.SearchView> ();

            return true;
        }

        [More un-related code]
    }
}

menu_search.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
  <item android:id="@+id/action_search"
        android:title="Search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

MyActivity.cs

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Support.V4.View;
using Android.Support.V7.App;
using Android.Views;
using Android.Widget;
using Toolbar = Android.Support.V7.Widget.Toolbar;
using SearchView = Android.Support.V7.Widget.SearchView;

namespace Project.Sources.Features
{
    [Activity(Label = "")]
    public class SearchActivity : AppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your application here
            SetContentView(Resource.Layout.search_activity);

            var _toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);


            //Se setea la actionbar
            _toolbar.SetNavigationIcon(Resource.Drawable.ic_arrow_back_white_24dp);
            SetSupportActionBar(_toolbar);
            //SupportActionBar.SetDisplayHomeAsUpEnabled(true);
            //SupportActionBar.SetHomeButtonEnabled(true);

        }

        SearchView _searchView;
        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            MenuInflater.Inflate(Resource.Menu.menu_search, menu);

            var item = menu.FindItem(Resource.Id.action_search);

            var searchItem = MenuItemCompat.GetActionView(item);
             _searchView = searchItem.JavaCast<SearchView>();

            _searchView.SetIconifiedByDefault(true);

            _searchView.QueryTextChange += (s, e) =>
            {
                Toast.MakeText(this, "Search: " + e.NewText, ToastLength.Short).Show();
            };

            _searchView.QueryTextSubmit += (s, e) =>
            {               
                Toast.MakeText(this, "Searched for: " + e.Query, ToastLength.Short).Show();
                e.Handled = true;
            };

            return base.OnCreateOptionsMenu(menu);

        }
    }
}

编辑: 更改类型 FragmentActivity

public class TabActivity : FragmentActivity

到 AppCompatActivity

public class SearchActivity : AppCompatActivity

我正在使用 Android.Support。V7.Widget 包并为我工作。