web-dev-qa-db-fra.com

Ajout de SearchView dans un fragment

Essayer d'inclure une searchview dans la barre d'actions. Pour cela, j'ai fait ce qui suit:

Créé MenuSearch.xml dans le dossier de menu comme indiqué ci-dessous:

<?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>

Inclus la méthode OnCreateOptionsMenu dans le fragment:

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));

    }

Et j'ai mis HasOptionsMenu = true; dans une création du fragment.

Avec le code ci-dessus, j'obtiens un pointeur null dans la ligne searchView.SetSearchableInfo.... Je ne sais pas pourquoi cela se produit, même si tout semble être correct et en place.

Sur la base de quelques suggestions pour résoudre un problème similaire, j'ai également testé l'option ci-dessous pour searchview.

        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));

Mais encore une fois, searchView a la valeur null.

Maintenant que j'ai essayé les options possibles, je ne comprends pas pourquoi searchview devient nul. 

Toute aide est très appréciée.

11
user264953

Changez votre MenuSearch.xml en 

<?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>

Et dans votre fragment pour ajouter 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) {

                                          }
                                      }
        );
    }
28
Pavan Bilagi

Réponse mise à jour pour 2018. Désolé pour Kotlin, si vous utilisez Java.

Votre ressource de menu xml (search_menu.xml par exemple):

<?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_search"
        app:showAsAction="collapseActionView|ifRoom"
        />
</menu>

Code de montage:

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater?) {
    super.onCreateOptionsMenu(menu, inflater)
    menu.clear()
    inflater?.inflate(R.menu.search_menu, menu)
    val searchView = SearchView((context as MainActivity).supportActionBar?.themedContext ?: context)
    menu.findItem(R.id.action_search).apply {
        setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW or MenuItem.SHOW_AS_ACTION_IF_ROOM)
        actionView = searchView
    }

    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String): Boolean {
            return false
        }

        override fun onQueryTextChange(newText: String): Boolean {
            return false
        }
    })
    searchView.setOnClickListener {view ->  }
}

Vous aurez probablement aussi besoin de mettre cette ligne dans onCreate() (travaillé pour mon fragment) pour que tout cela apparaisse:

setHasOptionsMenu(true)
4
Aqluse

j'ai résolu ce problème je veux partager ma réponse pour searchView NullPointerException

nous devons supprimer la méthode ci-dessous de l'activité principale

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

et utiliser fragment intérieur dans les méthodes OnActivityCreated setHasOptionsMenu(true) et Override

    @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);
    }
}
1
Dinesh

Votre search_options_menu.xml devrait ressembler à ceci:

<?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>

Remplacez onCreateOptionMenu méthode dans votre fragment setHasOptionsMenu(true); dans onCreate () sur votre fragment.

@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;
            }
        });

    }
0
Queendevelopers