0
votes

Android androidx.SearchView ne fonctionne pas

J'ai implémenté SearchView dans MaterialToolBar dans mon projet. Tout fonctionne bien sauf pour la dernière étape. Lorsque je tape quelque chose dans la barre de recherche et clique sur le bouton de recherche du clavier, rien ne s'affiche. Veuillez aider.

Vidéo de mon problème https://drive.google.com/file/0/1GpE16D8Dswn view? usp = drivesdk

Menu.xml

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.cart_search_menu, menu);
    MenuItem menuItem = menu.findItem(R.id.menu_search);
    SearchView searchView = (SearchView) menuItem.getActionView();
    searchView.setQueryHint("Type here to search");
    searchView.setMaxWidth(android.R.attr.width);

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            //getSearchResults(query); Also tried
            getSearchResults(searchView.getQuery().toString());
            if( ! searchView.isIconified()) {
                searchView.setIconified(true);
            }
            menuItem.collapseActionView();
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });

    return super.onCreateOptionsMenu(menu);
}

activity.xml

<com.google.android.material.appbar.MaterialToolbar
    android:id="@+id/category1_toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingEnd="10dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:background="@color/dark_blue"
    app:menu="@menu/cart_share"
    tools:ignore="RtlSymmetry">

    <ImageView
        android:id="@+id/img_back_all_category"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:contentDescription="TODO"
        android:src="@drawable/ic_keyboard_arrow_left" />

    <TextView
        android:id="@+id/tv_all_categories"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="@string/product_name"
        android:fontFamily="@font/montserrat"
        android:textStyle="bold"
        android:textSize="20sp"
        android:textColor="@color/white"
        android:layout_marginStart="25sp"/>
</com.google.android.material.appbar.MaterialToolbar>

code java

    <item
    android:id="@+id/menu_search"
    android:title="@string/search"
    android:icon="@drawable/ic_search"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="androidx.appcompat.widget.SearchView" />


3 commentaires

avez-vous ajouté ?


ouais < / code>


vérifiez mon code s'il vous plaît


4 Réponses :


1
votes
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.cart_search_menu, menu);

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setMaxWidth(Integer.MAX_VALUE);
        
        SearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                
                // your code
                
                return false;
            }

            @Override
            public boolean onQueryTextChange(String query) {
                // your code
                return false;
            }
        });
        return true;
    }

5 commentaires

J'ai essayé ce code maintenant et avant aussi mais ne fonctionne pas dans mon cas, vérifiez la vidéo que j'ai jointe vous comprendrez le problème.


Dans logcat, il n'affiche rien en rapport avec l'erreur.


@VaibhavA Résolu ce problème encore?


Oui, amiya, j'ai résolu ce problème en échangeant deux lignes. Vérifiez ma réponse ci-dessus. Pouvez-vous me dire pourquoi cela ne fonctionnait pas?


@VaibhavUne grosse erreur. vous devez d'abord exécuter setContentView .



1
votes

Vérifiez cette capture d'écran essayez ceci

​​dans le fichier de menu: p >

  private var searchItem : MenuItem? = null
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.search_tenant_menu, menu)
    searchItem = menu.findItem(R.id.actionTenantSearch)

    val searchView = searchItem?.actionView as SearchView
    searchView.setOnQueryTextListener(object :
        SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(s: String): Boolean {
            CommonUtils.showToast(requireContext(), s)
            searchView.clearFocus()
            return true
        }

        override fun onQueryTextChange(s: String): Boolean {

            return true
        }
    })
    super.onCreateOptionsMenu(menu, inflater)
}

Dans le fichier kotlin:

<item
    android:id="@+id/actionTenantSearch"
    android:icon="@drawable/ic_search"
    android:title="@string/search"
    app:showAsAction="ifRoom|collapseActionView"
    app:actionViewClass="androidx.appcompat.widget.SearchView"
    />


0 commentaires

0
votes

@vaibhav avez-vous implémenté une classe filtrable dans votre listview ou recyclerview. Après cela, appelez cette méthode filtrable dans votre requête de recherche. Vous obtiendrez un résultat approprié Comme ceci,

la classe publique Adaptername étend RecyclerView.Adapter implémente Filterable {

}

CustomFilter filter;

@Override
public Filter getFilter() {
    if (filter == null) {
        filter = new CustomFilter();
    }
    return filter;
}

class CustomFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        // TODO Auto-generated method stub
        FilterResults results = new FilterResults();
        if (constraint != null && constraint.length() > 0) {
            //CONSTARINT TO UPPER
            constraint = constraint.toString().toUpperCase();
            ArrayList<AllInOnetItem> filters = new ArrayList<AllInOnetItem>();
            //get specific items
            for (int i = 0; i < filterList.size(); i++) {
                if (filterList.get(i).getName().toUpperCase().contains(constraint)) {
                    AllInOnetItem p = new AllInOnetItem(filterList.get(i).getName(), filterList.get(i).getNumber(),filterList.get(i).getEmail());
                    filters.add(p);
                }
            }
            results.count = filters.size();
            results.values = filters;
        } else {
            results.count = filterList.size();
            results.values = filterList;
        }
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        // TODO Auto-generated method stub
        allInOnetItems = (ArrayList<AllInOnetItem>) results.values;
        notifyDataSetChanged();
    }
}


1 commentaires

Merci, mais je n'utilise pas le filtre. Ma solution est répertoriée ci-dessus.



0
votes

J'ai changé la séquence des lignes de code après cela, cela a bien fonctionné.

Avant:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product_list);
Toolbar toolbar = findViewById(R.id.category1_toolbar);
setSupportActionBar(toolbar);

Après: strong>

super.onCreate(savedInstanceState);
Toolbar toolbar = findViewById(R.id.category1_toolbar);
setSupportActionBar(toolbar);
setContentView(R.layout.activity_product_list);


0 commentaires