2015-05-01 32 views
1

我使用的動作條菜單:Xamarin的Android:動作條搜索查看返回的ActionView空

<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不爲空。 有人可以請同樣的一些燈光?

回答

4

問題是您正試圖將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; 
    } 
} 

編輯:

好了,所以上面的回答仍然是相關的,這說明使用支持v7。無論哪種方式,新版本的Xamarin.Android明確指出,您將要在您的AXML/XML文件中引用的所有視圖和類型都需要使用[Register("my.view.Name")]。如果您不這樣做,那麼在編譯應用程序時,將使用校驗和,而不是以前使用的名稱空間作爲包名稱。這意味着你將永遠無法找到視圖。

所以在您的自定義AppSearchView類,你需要添加RegisterAttributeFlags像:

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

現在,你應該能夠找到ActionView

有關Xamarin.Android 5的突變變化的更多信息可以閱讀on the forums

+0

其實ActionView屬性對於搜索菜單項是NULL。所以在這裏使用JavaCast沒有用。另外,我沒有使用MenuItemCompat,因爲我支持Android 4.0以上的設備。你認爲這會有所作爲? –

+0

閱讀編輯:) – Cheesebaron