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

时间:2015-07-27 14:06:36

标签: android android-actionbar searchview

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

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

对我来说,当我给菜单充气时,我会收到搜索菜单项,但它的ActionView属性始终为null。当我使用MenuItemCompat.GetActionView方法时,我得到了相同的行为。

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

有谁知道我在这里做错了什么?我的代码片段在下面。

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]
    }
}

3 个答案:

答案 0 :(得分:3)

我终于弄明白了我的问题。问题是我试图使用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]
    }
}

答案 1 :(得分:0)

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

所以来自:

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

要:

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

答案 2 :(得分:0)

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包并为我工作。