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 包并为我工作。
我遇到一个问题,其中包含 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 包并为我工作。