我遇到的问题是,包含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]
}
}
答案 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包并为我工作。