टूलबार Android में SearchView का उपयोग कैसे करें


124

जिस कोड पर मैं काम कर रहा हूं, वह a Toolbarऔर inflating a का उपयोग कर रहा है menu

यहाँ कोड है

private Toolbar mToolbar;
mToolbar.inflateMenu(R.menu.chat_screen_menu);
setupMenu ();
private void setupMenu ()
   {
   mMenu = mToolbar.getMenu();
   if (mMenu != null)
      {
       if (mChatPager != null && mChatPager.getCurrentItem() > 0)
          {
          mMenu.setGroupVisible(R.id.menu_group_chats, true);
          mMenu.setGroupVisible(R.id.menu_group_contacts, false);
          }
       else
          {
           mMenu.setGroupVisible(R.id.menu_group_chats, false);
           mMenu.setGroupVisible(R.id.menu_group_contacts, true);
           mMenu.setGroupVisible(R.id.menu_group_otr_verified,false);
           mMenu.setGroupVisible(R.id.menu_group_otr_unverified,false);
           mMenu.setGroupVisible(R.id.menu_group_otr_off,false);
          }
    }
    mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener ()
    {
    ..........
    }
}

लेकिन अब, उन्हें एक Searchबटन की आवश्यकता है tool_bar। मैं इसे लगाने में कामयाब रहा, मैंने यहां एक मार्गदर्शक का अनुसरण किया जब मैंने खोज के लिए कुछ लिखने की कोशिश की, तो मैंने listenerकभी नहीं दिखाए गए परीक्षण के लिए जो टोस्ट डाला था । जो इंगित करता listenerहै कि काम नहीं कर रहा है

@Override
    public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.chat_screen_menu, menu);

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_menu_search));
    final Toast toast = new Toast(mApp);

    if (mSearchView != null )
    {
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
        {
            public boolean onQueryTextChange(String newText)
            {
                mSearchString = newText;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show();
                return true;
            }

            public boolean onQueryTextSubmit(String query)
            {
                mSearchString = query;
                //doFilterAsync(mSearchString);
                toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show();

                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);
    }

    return true;

}

जवाबों:


205

आपको उसके लिए Appcompatलाइब्रेरी का उपयोग करना होगा । जो नीचे की तरह प्रयोग किया जाता है:

dashboard.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="always|collapseActionView"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        android:title="Search"/>
</menu>

गतिविधि फ़ाइल (जावा में):

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.dashboard, menu);

     MenuItem searchItem = menu.findItem(R.id.action_search);

    SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);

    SearchView searchView = null;
    if (searchItem != null) {
        searchView = (SearchView) searchItem.getActionView();
    }
    if (searchView != null) {
        searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
    }
        return super.onCreateOptionsMenu(menu);
}

गतिविधि फ़ाइल (कोटलिन में):

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_search, menu)

    val searchItem: MenuItem? = menu?.findItem(R.id.action_search)
    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView: SearchView? = searchItem?.actionView as SearchView

    searchView?.setSearchableInfo(searchManager.getSearchableInfo(componentName))
    return super.onCreateOptionsMenu(menu)
}

प्रकट फ़ाइल:

<meta-data 
      android:name="android.app.default_searchable" 
      android:value="com.apkgetter.SearchResultsActivity" /> 

        <activity
            android:name="com.apkgetter.SearchResultsActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>

खोज योग्य xml फ़ाइल:

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:hint="@string/search_hint"
    android:label="@string/app_name" />

और अंत में, अपने SearchResultsActivityवर्ग कोड। अपनी खोज का परिणाम दिखाने के लिए।


18
ध्यान दें कि अब आपको चाहिएimport android.support.v7.widget.SearchView
जोकिन इराचुक

धन्यवाद, "गो" क्लिक को कैसे हैंडल करना है, इस पर कोई विचार? इससे मदद मिलेगी
बाला विष्णु

2
मैं सिर्फ आधिकारिक दस्तावेज को लिंक करूंगा, जहां आप क्वेरी डेवलपर
।android.com

2
ऐप पर ध्यान दें: ऐक्शन व्यू क्लॉस एंड्रॉइड के बजाय: एक्शन व्यूक्लास
ड्रैगनट्यूट ऑक्ट

1
यदि आप androidX उपयोग करने के लिए पलायन कर चुके हैं:androidx.appcompat.widget.SearchView
Daniil

169

यदि आप अपने अंदर खोज सुविधा सेटअप करना चाहते हैं Fragment, तो बस इन कुछ पंक्तियों को जोड़ें:

चरण 1 - आपके लिए खोज फ़ील्ड जोड़ें toolbar:

<item
    android:id="@+id/action_search"
    android:icon="@android:drawable/ic_menu_search"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView"
    android:title="Search"/>

चरण 2 - अपने में तर्क जोड़ेंonCreateOptionsMenu()

import android.support.v7.widget.SearchView; // not the default !

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

    MenuItem myActionMenuItem = menu.findItem( R.id.action_search);
    searchView = (SearchView) myActionMenuItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // Toast like print
            UserFeedback.show( "SearchOnQueryTextSubmit: " + query);
            if( ! searchView.isIconified()) {
                searchView.setIconified(true);
            }
            myActionMenuItem.collapseActionView();
            return false;
        }
        @Override
        public boolean onQueryTextChange(String s) {
            // UserFeedback.show( "SearchOnQueryTextChanged: " + s);
            return false;
        }
    });
    return true;
}

29
यदि उपयोगकर्ता किसी खोज क्वेरी को सबमिट करता है, तो यह उत्तर तब और अधिक मददगार होता है, जब आप किसी नई गतिविधि को बनाना / ले जाना नहीं चाहते। यह आपको एक ही गतिविधि / खंड पर रहने और उपयोगकर्ताओं के इनपुट के आधार पर एक दृश्य को अपडेट करने की अनुमति देगा। उत्तम सामग्री।
निक डेड

3
UserFeedback ... मेरा टोस्ट-एक जैसे तरीका है।
tm1701

खोज दृश्य में कीबोर्ड इनपुट नहीं लिया गया
सारावन

क्या है R.menu.main?
एलस्टन

public void onCreateOptionsMenu (@NonNull Menu menu, @NonNull MenuInflater inflater) {} आप सीधे इस विधि को यहां कॉल कर सकते हैं, आप स्वयं मेनू को संक्रमित कर सकते हैं, और गतिविधि का उपयोग किए बिना इस निर्देश को खंड से संभाल सकते हैं। अच्छा धन्यवाद
अमर सिंह

40

यदि आप इसे सीधे टूलबार में जोड़ना चाहते हैं।

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.Toolbar
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <SearchView
            android:id="@+id/searchView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:iconifiedByDefault="false"
            android:queryHint="Search"
            android:layout_centerHorizontal="true" />

    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>


2
यदि आप SearchView का समर्थन कर रहे हैं, तो इसे android.support.v7.widget.SearchViewXML में भी घोषित करना न भूलें ।
गाड़ी

ढाल में जोड़ने के लिए मत भूलनाimplementation 'com.android.support:design:$latest_version'
अली

आइकॉनिक क्या है ?
इगोरगानापोलस्की

,अगर आप चाहते हैं कि खोज क्षेत्र हमेशा दृश्यमान रहे, तो setIconifiedByDefault (झूठा) को डॉक्स से
noe

16

RecyclerView के साथ SearchView को एकीकृत करना

1) मेनू में SearchView आइटम जोड़ें

SearchView के रूप में जोड़ा जा सकता है actionViewमेनू का उपयोग कर के में

app: useActionClass = "android.support.v7.widget.SearchView"।

<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="rohksin.com.searchviewdemo.MainActivity">
<item
    android:id="@+id/searchBar"
    app:showAsAction="always"
    app:actionViewClass="android.support.v7.widget.SearchView"
    />
</menu>

2) अपनी गतिविधि में SearchView.OnQueryTextListener को लागू करें

SearchView.OnQueryTextListenerदो सार विधियाँ हैं। तो आपकी गतिविधि कंकाल खोज दृश्य पाठ श्रोता को लागू करने के बाद अब ऐसा दिखेगा।

YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{

   public boolean onQueryTextSubmit(String query)

   public boolean onQueryTextChange(String newText) 

}

3) SerchView संकेत पाठ, श्रोता आदि सेट करें

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);

    MenuItem searchItem = menu.findItem(R.id.searchBar);

    SearchView searchView = (SearchView) searchItem.getActionView();
    searchView.setQueryHint("Search People");
    searchView.setOnQueryTextListener(this);
    searchView.setIconified(false);

    return true;
}

4) SearchView.OnQueryTextListener को लागू करें

यह आप श्रोता के सार तरीकों को लागू कर सकते हैं।

@Override
public boolean onQueryTextSubmit(String query) {

    // This method can be used when a query is submitted eg. creating search history using SQLite DB

    Toast.makeText(this, "Query Inserted", Toast.LENGTH_SHORT).show();
    return true;
}

@Override
public boolean onQueryTextChange(String newText) {

    adapter.filter(newText);
    return true;
}

5) अपने RecyclerView Adapter में एक फ़िल्टर विधि लिखें।

आप अपनी आवश्यकता के आधार पर अपने तर्क के साथ आ सकते हैं। यहाँ नाम की सूची दिखाने के लिए नमूना कोड स्निपेट है जिसमें पाठ टाइप किया गया है SearchView

public void filter(String queryText)
{
    list.clear();

    if(queryText.isEmpty())
    {
        list.addAll(copyList);
    }
    else
    {

        for(String name: copyList)
        {
            if(name.toLowerCase().contains(queryText.toLowerCase()))
            {
                list.add(name);
            }
        }

    }

    notifyDataSetChanged();
}

पूर्ण कार्य कोड नमूना पाया जा सकता है> यहां
आप इस म्यूजिक ऐप में SQLite डेटाबेस के साथ SearchView पर कोड की जांच भी कर सकते हैं


मेनू क्यों आवश्यक है?
इगोरगानापोलस्की

1

menu.xmlफ़ाइल के उपयोग के बिना SearchView को लागू करना और बटन के माध्यम से खोलना

आपके लिए Activityहमें उस पद्धति का उपयोग करने की आवश्यकता है onCreateOptionsMenuजिसमें हम प्रोग्रामेटिक रूप से फुलाएंगेSearchView

private MenuItem searchMenu;
private String mSearchString="";

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        SearchManager searchManager = (SearchManager) StoreActivity.this.getSystemService(Context.SEARCH_SERVICE);


        SearchView mSearchView = new SearchView(getSupportActionBar().getThemedContext());
        mSearchView.setQueryHint(getString(R.string.prompt_search)); /// YOUR HINT MESSAGE
        mSearchView.setMaxWidth(Integer.MAX_VALUE);

        searchMenu = menu.add("searchMenu").setVisible(false).setActionView(mSearchView);
        searchMenu.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);


        assert searchManager != null;
        mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        mSearchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            public boolean onQueryTextChange(String newText) {
                mSearchString = newText;

                return true;
            }

            public boolean onQueryTextSubmit(String query) {
                mSearchString = query;

                searchMenu.collapseActionView();


                return true;
            }
        };

        mSearchView.setOnQueryTextListener(queryTextListener);


        return true;
    }

और अपनी गतिविधि वर्ग में, आप SearchViewनीचे दिए गए टूलबार पर किसी भी बटन पर क्लिक कर सकते हैं

YOUR_BUTTON.setOnClickListener(view -> {

            searchMenu.expandActionView();

        });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.