【问题标题】:Xamarin Android search view in action bar is null操作栏中的 Xamarin Android 搜索视图为空
【发布时间】:2015-10-17 18:30:32
【问题描述】:

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

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

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

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

有人知道我在这里做错了什么吗?我的代码 sn-ps 如下。

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

【问题讨论】:

  • 还有其他人有什么想法吗? Jraco11 响应无效

标签: android android-actionbar searchview


【解决方案1】:

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

【讨论】:

  • 您好 - 我的 VS 无法识别 Android.Widget.SearchView - 你是如何让它工作的?
【解决方案2】:

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

所以来自:

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

收件人:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您能解释一下您的代码有哪些更改可以解决提问者的问题吗?
    猜你喜欢
    • 2014-04-03
    • 2016-11-05
    • 2023-03-06
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多