android - Xamarin 安卓 : ActionBar SearchView ActionView returns null

标签 android xamarin xamarin.android xamarin-studio

我将 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);
}

我有一个自定义搜索 View 实现:

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 为空(因此,搜索 View 为空)。但是同样的代码在我的另一个应用程序中工作。这两个应用程序都使用 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 文件中引用的所有 View 和类型都需要使用 [Register("my.view.Name")]。 .如果您不这样做,则在编译应用程序时,将使用校验和作为您的程序包名称,而不是之前使用的命名空间。这意味着您将永远无法找到 View 。

所以在你的习惯中AppSearchView您需要添加 RegisterAttributeFlags 类喜欢:

[Register("com.abc.AppSearchView)]
public class AppSearchView : SearchView
{
}

现在您应该能够找到 ActionView .

有关 Xamarin.Android 5 重大更改的更多信息,请阅读 on the forums .

关于android - Xamarin 安卓 : ActionBar SearchView ActionView returns null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29987333/

相关文章:

android - 无法使用 Android Studio 3.1/3.2 Canary 将 twitter-kit-android 集成到我的应用程序中

xamarin - 如何在我的 Xamarin Forms 应用程序上本地保存一些用户数据?

xamarin - initWithCoder 已使用最新版本的 Xamarin.iOS 明确标记为不可用错误

visual-studio-2010 - 用于 Visual Studio 2010 的 Monodroid "Hello-World"失败

android - 如何读取检测到的 NFC 标签(NDEF 消息)。安卓NFC

Android Camera2画面黑屏,录像只有1秒

c# - Xamarin Android - OutOfMemoryError 异常 - 大图

xamarin.android - 如何在 Xamarin 中设置标签文本的最大长度

android - 如何在 Xamarin.Android 中保持 Button.Pressed 状态?

java - ABS - fragment - 菜单膨胀问题