2015-12-15 12 views
7

Próba włączenia wyszukiwania w pasku akcji. Do tego mam zrobić, co następuje:Dodawanie SearchView w Fragmenty

Created MenuSearch.xml w folderze menu, jak podano poniżej:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
    android:id="@+id/action_search" 
    android:actionViewClass="Android.Support.V7.Widget.SearchView" 
    android:icon="@android:drawable/ic_menu_search" 
    android:showAsAction="always" 
    android:title="Search"/> 

</menu> 

wliczony metoda OnCreateOptionsMenu we fragmencie:

public override void OnCreateOptionsMenu(IMenu menu, MenuInflater inflater) 
    { 
     inflater.Inflate(Resource.Menu.MenuSearch, menu); 
     base.OnCreateOptionsMenu(menu, inflater); 
     var searchManager = (SearchManager) this.Activity.GetSystemService(Context.SearchService); 
     searchView = (SearchView) (menu.FindItem(Resource.Id.action_search).ActionView); 
     searchView.SetSearchableInfo(searchManager.GetSearchableInfo(Activity.ComponentName)); 

    } 

I mam ustaw HasOptionsMenu = true; w oncreate fragmentu.

Za pomocą powyższego kodu otrzymuję wskaźnik zerowy w linii searchView.SetSearchableInfo.... Nie wiem, dlaczego tak się dzieje, chociaż wszystko wydaje się poprawne i na miejscu.

Na podstawie kilku sugestii dotyczących rozwiązania podobnego problemu wypróbowałem również opcję poniżej dla wyszukiwania.

 var item = menu.FindItem (Resource.Id.action_search); 
     var searchItem = MenuItemCompat.GetActionView(item); 
     searchView = searchItem.JavaCast<Android.Support.V7.Widget.SearchView>(); 
     searchView.SetSearchableInfo(searchManager.GetSearchableInfo(Activity.ComponentName)); 

Ale ponownie otrzymuję searchView jako wartość null.

Teraz, gdy wypróbowałem możliwe opcje, nie mam pojęcia, dlaczego widok wyszukiwania staje się pusty.

Każda pomoc jest doceniana.

Odpowiedz

19

Zmień MenuSearch.xml do

<?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="@string/app_name" 
     android:icon="@drawable/ic_action_search" 
     app:showAsAction="collapseActionView|ifRoom" 
     /> 
</menu> 

I w swoim fragmentem, aby dodać searchView.setOnQueryTextListener

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.search_option_menu, menu); 
     MenuItem item = menu.findItem(R.id.action_search); 
     SearchView searchView = new SearchView(((MainActivity) mContext).getSupportActionBar().getThemedContext()); 
     MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); 
     MenuItemCompat.setActionView(item, searchView); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String newText) { 
       return false; 
      } 
     }); 
     searchView.setOnClickListener(new View.OnClickListener() { 
              @Override 
              public void onClick(View v) { 

              } 
             } 
     ); 
    } 
+1

uzyskiwanie NullPointerException na SearchView searchView = new SearchView (((główną działalność) mContext) .getSupportActionBar() getThemedContext().); – Dinesh

+0

@ Dinesh Dostaję to również. Udało ci się to naprawić? – CapturedTree

+0

Twój styl aplikacji prawdopodobnie nie obsługuje pasków akcji. Sprawdź, czy twój styl to robi. –

-1

w moim fragment za onCreateOptionsMenu kod

SearchManager searchManager = 
     (SearchManager)getActivity().getSystemService(Context.SEARCH_SERVICE); 
SearchableInfo searchableInfo = 
     searchManager.getSearchableInfo(getActivity().getComponentName()); 
searchItem = menu.findItem(R.id.menu_search); 
SearchView searchView = (SearchView) searchItem.getActionView(); 
searchView.setSearchableInfo(searchableInfo); 

wytwarzany następujący komunikat o błędzie: java.lang.NullPointerException: Attemp t wywołanie metody wirtualnej 'void android.support.v7.widget.SearchView.setSearchableInfo (android.app.SearchableInfo)' w odwołaniu do obiektu zerowego

Po zmianie w menu.xml android: actionViewClass do aplikacji: actionViewClass the problem nie powtórzył się ponownie. menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context="..."> 
<item 
android:id="@+id/menu_search" 
android:title="@string/menu_search" 
app:actionViewClass="android.support.v7.widget.SearchView" 
app:showAsAction="ifRoom"> 

1

I rozwiązać ten problem i chce podzielić się moją odpowiedź na searchView NullPointerException

musimy usunąć poniżej metody z działalności Głównego

 public boolean onOptionsItemSelected(MenuItem item) { 
      int id = item.getItemId(); 
      return true; 

i użyj wewnętrznego fragmentu w OnActivityCreated setHasOptionsMenu(true) i Zastąp metody

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     inflater.inflate(R.menu.menu, menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle item selection 
     switch (item.getItemId()) { 
      case R.id.action_search: 

    //  onCall(); //your logic 

      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 
0

Twoje search_options_menu.xml powinna wyglądać następująco:

<?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="@string/app_name" 
     android:icon="@drawable/ic_action_search" 
     app:showAsAction="collapseActionView|ifRoom" 
     /> 
</menu> 

Zastąp onCreateOptionMenu metodę w swoim fragmencie setHasOptionsMenu(true); wewnątrz onCreate() na swoim fragmencie.

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     menu.clear(); 
     inflater.inflate(R.menu.search_option_menu, menu); 
     MenuItem item = menu.findItem(R.id.action_search); 
       SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem); 
     MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW | MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); 
     MenuItemCompat.setActionView(item, searchView); 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String newText) { 
        //Do search code here 
       return true; 
      } 
     }); 

    }