Xamarin Android: ActionBar SearchView ActionView returns 空
Xamarin Android: ActionBar SearchView ActionView returns null
我将 ActionBar 菜单用作:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_search"
android:actionViewClass="com.abc.AppSearchView"
android:icon="@drawable/ic_menu_search"
android:showAsAction="always|collapseActionView" />
</menu>
然后我给它充气然后:
public override bool OnCreateOptionsMenu (IMenu menu)
{
MenuInflater.Inflate (Resource.Menu.actionMenu, menu);
_actionBarMenu = menu;
// Get the SearchView and set the searchable configuration
var searchManager = (SearchManager)GetSystemService (SearchService);
var searchMenuItem = menu.FindItem (Resource.Id.menu_search);
var searchView = (AppSearchView)searchMenuItem.ActionView;
// Assumes current activity is the searchable activity
searchView.SetSearchableInfo (searchManager.GetSearchableInfo (ComponentName));
searchView.SetSearchViewListener (this);
return base.OnCreateOptionsMenu (menu);
}
我有一个自定义搜索视图实现:
public class AppSearchView : SearchView
{
private IAppSearchViewListener mListener;
public AppSearchView (Context ctxt) : base (ctxt)
{
}
public override void OnActionViewCollapsed ()
{
if (mListener != null)
mListener.OnSearchViewCollapsed (this);
base.OnActionViewCollapsed ();
}
public override void OnActionViewExpanded ()
{
if (mListener != null)
mListener.OnSearchViewExpanded (this);
base.OnActionViewExpanded ();
}
public interface IAppSearchViewListener
{
void OnSearchViewCollapsed (SearchView sView);
void OnSearchViewExpanded (SearchView sView);
}
public void SetSearchViewListener (IAppSearchViewListener listener)
{
mListener = listener;
}
}
searchMenuItem.ActionView
为空(因此,搜索视图为空)。但是同样的代码在我的另一个应用程序中工作。两个应用程序都使用 Xamarin.Android.Support.v13
。
另外,如果我使用 android.widget.SearchView
,它工作正常并且 ActionView
不为空。
有人可以解释一下吗?
问题是您正试图将 Java 类型转换为 .NET 类型。这仅适用于某些类型。
在您的 OnCreateOptionsMenu
实施中,您需要使用 .JavaCast<T>()
扩展方法来帮助您。
像这样的东西对我有用:
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.main, menu);
var item = menu.FindItem(Resource.Id.action_search);
var searchView = MenuItemCompat.GetActionView(item);
_searchView = searchView.JavaCast<SearchView>();
_searchView.QueryTextChange += (s, e) => _adapter.Filter.InvokeFilter(e.NewText);
_searchView.QueryTextSubmit += (s, e) =>
{
// Handle enter/search button on keyboard here
Toast.MakeText(this, "Searched for: " + e.Query, ToastLength.Short).Show();
e.Handled = true;
};
MenuItemCompat.SetOnActionExpandListener(item, new SearchViewExpandListener(_adapter));
return true;
}
这是SearchViewExpandListener
:
private class SearchViewExpandListener
: Java.Lang.Object, MenuItemCompat.IOnActionExpandListener
{
private readonly IFilterable _adapter;
public SearchViewExpandListener(IFilterable adapter)
{
_adapter = adapter;
}
public bool OnMenuItemActionCollapse(IMenuItem item)
{
_adapter.Filter.InvokeFilter("");
return true;
}
public bool OnMenuItemActionExpand(IMenuItem item)
{
return true;
}
}
编辑:
好的,所以上面的答案仍然是相关的,它显示了 Support v7 的用法。无论哪种方式,Xamarin.Android 的新版本明确指定,您要在 AXML/XML 文件中引用的所有视图和类型都需要使用 [Register("my.view.Name")]
。如果您不这样做,则在编译应用程序时,将使用校验和作为您的程序包名称,而不是之前使用的命名空间。这意味着您将永远无法找到视图。
因此,在您的自定义 AppSearchView
class 中,您需要添加 RegisterAttributeFlags
,例如:
[Register("com.abc.AppSearchView)]
public class AppSearchView : SearchView
{
}
现在您应该可以找到 ActionView
.
有关 Xamarin.Android 5 重大更改的更多信息,请阅读 on the forums。
我将 ActionBar 菜单用作:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_search"
android:actionViewClass="com.abc.AppSearchView"
android:icon="@drawable/ic_menu_search"
android:showAsAction="always|collapseActionView" />
</menu>
然后我给它充气然后:
public override bool OnCreateOptionsMenu (IMenu menu)
{
MenuInflater.Inflate (Resource.Menu.actionMenu, menu);
_actionBarMenu = menu;
// Get the SearchView and set the searchable configuration
var searchManager = (SearchManager)GetSystemService (SearchService);
var searchMenuItem = menu.FindItem (Resource.Id.menu_search);
var searchView = (AppSearchView)searchMenuItem.ActionView;
// Assumes current activity is the searchable activity
searchView.SetSearchableInfo (searchManager.GetSearchableInfo (ComponentName));
searchView.SetSearchViewListener (this);
return base.OnCreateOptionsMenu (menu);
}
我有一个自定义搜索视图实现:
public class AppSearchView : SearchView
{
private IAppSearchViewListener mListener;
public AppSearchView (Context ctxt) : base (ctxt)
{
}
public override void OnActionViewCollapsed ()
{
if (mListener != null)
mListener.OnSearchViewCollapsed (this);
base.OnActionViewCollapsed ();
}
public override void OnActionViewExpanded ()
{
if (mListener != null)
mListener.OnSearchViewExpanded (this);
base.OnActionViewExpanded ();
}
public interface IAppSearchViewListener
{
void OnSearchViewCollapsed (SearchView sView);
void OnSearchViewExpanded (SearchView sView);
}
public void SetSearchViewListener (IAppSearchViewListener listener)
{
mListener = listener;
}
}
searchMenuItem.ActionView
为空(因此,搜索视图为空)。但是同样的代码在我的另一个应用程序中工作。两个应用程序都使用 Xamarin.Android.Support.v13
。
另外,如果我使用 android.widget.SearchView
,它工作正常并且 ActionView
不为空。
有人可以解释一下吗?
问题是您正试图将 Java 类型转换为 .NET 类型。这仅适用于某些类型。
在您的 OnCreateOptionsMenu
实施中,您需要使用 .JavaCast<T>()
扩展方法来帮助您。
像这样的东西对我有用:
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.main, menu);
var item = menu.FindItem(Resource.Id.action_search);
var searchView = MenuItemCompat.GetActionView(item);
_searchView = searchView.JavaCast<SearchView>();
_searchView.QueryTextChange += (s, e) => _adapter.Filter.InvokeFilter(e.NewText);
_searchView.QueryTextSubmit += (s, e) =>
{
// Handle enter/search button on keyboard here
Toast.MakeText(this, "Searched for: " + e.Query, ToastLength.Short).Show();
e.Handled = true;
};
MenuItemCompat.SetOnActionExpandListener(item, new SearchViewExpandListener(_adapter));
return true;
}
这是SearchViewExpandListener
:
private class SearchViewExpandListener
: Java.Lang.Object, MenuItemCompat.IOnActionExpandListener
{
private readonly IFilterable _adapter;
public SearchViewExpandListener(IFilterable adapter)
{
_adapter = adapter;
}
public bool OnMenuItemActionCollapse(IMenuItem item)
{
_adapter.Filter.InvokeFilter("");
return true;
}
public bool OnMenuItemActionExpand(IMenuItem item)
{
return true;
}
}
编辑:
好的,所以上面的答案仍然是相关的,它显示了 Support v7 的用法。无论哪种方式,Xamarin.Android 的新版本明确指定,您要在 AXML/XML 文件中引用的所有视图和类型都需要使用 [Register("my.view.Name")]
。如果您不这样做,则在编译应用程序时,将使用校验和作为您的程序包名称,而不是之前使用的命名空间。这意味着您将永远无法找到视图。
因此,在您的自定义 AppSearchView
class 中,您需要添加 RegisterAttributeFlags
,例如:
[Register("com.abc.AppSearchView)]
public class AppSearchView : SearchView
{
}
现在您应该可以找到 ActionView
.
有关 Xamarin.Android 5 重大更改的更多信息,请阅读 on the forums。