SearchView's OnCloseListener काम नहीं करता है


101

मैं SearchViewAndroid 3.0+ ActionBar के लिए समर्थन जोड़ने का प्रयास कर रहा हूं , लेकिन मुझे नहीं मिल रहा हैOnCloseListener काम करने की अनुमति ।

यहाँ मेरा कोड है:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    searchView = (SearchView) menu.findItem(R.id.search_textbox).getActionView();
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextChange(String newText) {
            searchLibrary(newText);
            return false;
        }
        @Override
        public boolean onQueryTextSubmit(String query) { return false; }
    });
    searchView.setOnCloseListener(new OnCloseListener() {
        @Override
        public boolean onClose() {
            System.out.println("Testing. 1, 2, 3...");
            return false;
        }
    });
    return true;
}

खोज बढ़िया काम करती है और हर एक को छोड़कर काम कर रही है OnCloseListener। लोगकैट पर कुछ भी नहीं छापा जा रहा है। जब मैं "क्लोज़" बटन दबा रहा हूं, तो यहां लॉगकोट है:

02-17 13:01:52.914: I/TextType(446): TextType = 0x0
02-17 13:01:57.344: I/TextType(446): TextType = 0x0
02-17 13:02:02.944: I/TextType(446): TextType = 0x0

मैंने प्रलेखन और नमूनों के माध्यम से देखा है , लेकिन इसे बदलने के लिए कुछ भी नहीं लगा। मैं इसे आइसक्रीम ट्रांसफॉर्मर पर आसुस ट्रांसफॉर्मर प्राइम और गैलेक्सी नेक्सस पर चला रहा हूं। कोई विचार?

अपडेट करें:

हाँ - काम System.out.println() करता है । यहाँ सबूत है:

   @Override
 public boolean onQueryTextChange(String newText) {
    System.out.println(newText + "hello");
    searchLibrary(newText);
    return false;
 }

इस Logcat में परिणाम:

02-17 13:04:20.094: I/System.out(21152): hello
02-17 13:04:24.914: I/System.out(21152): thello
02-17 13:04:25.394: I/System.out(21152): tehello
02-17 13:04:25.784: I/System.out(21152): teshello
02-17 13:04:26.064: I/System.out(21152): testhello

हम्म, एंड्रॉइड 3.2 के साथ मेरे लिए ठीक काम करता है लेकिन 4.0+ के लिए नहीं
PJL


3
मुझे खुशी है कि यह सिर्फ मेरे लिए यह समस्या नहीं है। किसी के पास नीचे के अलावा कोई अन्य हैक है?
बेनकैलिस

2
अगर showAsActionसेट किया गया है तो मैंने दो चीजें सीखी हैं always। खोज बॉक्स का अपना एक नजदीकी बटन होता है, लेकिन अगर वह इसके लिए सेट ifRoom | collapseActionViewहोता है तो एक्शन बार पर फैलता है।
बेरकी सेप

जवाबों:


153

मैं भी इस समस्या को पूरा करता हूं, और मेरे पास "ऑन्कोलोसिस्टनर" देने के अलावा कोई विकल्प नहीं है। इसके बजाय, आप अपना मेनू प्राप्त कर सकते हैं setOnActionExpandListener। फिर अकल्पनीय तरीकों को ओवरराइड करें।

@Override
public boolean onMenuItemActionExpand(MenuItem item) {
    // TODO Auto-generated method stub
    Log.d("*******","onMenuItemActionExpand");
    return true;
}

@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
    //do what you want to when close the sesarchview
    //remember to return true;
    Log.d("*******","onMenuItemActionCollapse");
    return true;
}

मेरा मानना ​​है कि हम केवल ActionBar के SearchView के बारे में बात कर रहे हैं, जो केवल मधुकोश है +
NKijak

onCloseListener का उपयोग करके परेशान न हों, बस अपने मेनू आइटम के साथ इसका उपयोग करें।
रॉबर्ट

12
मुझे लगता है कि आप पहले API स्तरों के लिए MenuItemCompat.OnActionExpandListener का उपयोग कर सकते हैं: डेवलपर.
android.com/reference/android/support/v4/view/…

2
पूर्ण उत्तर:if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1) item.SetOnActionExpandListener(this); else MenuItemCompat.SetOnActionExpandListener(item, this);
FindOutIslamNow

61

Android API 14+ (ICS और उससे अधिक) के लिए इस कोड का उपयोग करें:

// When using the support library, the setOnActionExpandListener() method is
// static and accepts the MenuItem object as an argument
MenuItemCompat.setOnActionExpandListener(menuItem, new OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        // Do something when collapsed
        return true;  // Return true to collapse action view
    }

    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        // Do something when expanded
        return true;  // Return true to expand action view
    }
});

अधिक जानकारी के लिए: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView

Ref: onActionCollapse / onActionExpand


31

इस समस्या के लिए मैं कुछ इस तरह से आया,

private SearchView mSearchView;

@TargetApi(14)
@Override
public boolean onCreateOptionsMenu(Menu menu)
{

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

    mSearchView = (SearchView) menu.findItem(R.id.itemSearch).getActionView();

    MenuItem menuItem = menu.findItem(R.id.itemSearch);

    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    {
        menuItem.setOnActionExpandListener(new OnActionExpandListener()
        {

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item)
            {
                // Do something when collapsed
                Log.i(TAG, "onMenuItemActionCollapse " + item.getItemId());
                return true; // Return true to collapse action view
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item)
            {
                // TODO Auto-generated method stub
                Log.i(TAG, "onMenuItemActionExpand " + item.getItemId());
                return true;
            }
        });
    } else
    {
        // do something for phones running an SDK before froyo
        mSearchView.setOnCloseListener(new OnCloseListener()
        {

            @Override
            public boolean onClose()
            {
                Log.i(TAG, "mSearchView on close ");
                // TODO Auto-generated method stub
                return false;
            }
        });
    }


    return super.onCreateOptionsMenu(menu);

}

1
यदि आपने हमेशा setIconofiedByDefault (गलत) का उपयोग करके विस्तार किया है तो क्या होगा? यह काम नहीं करता है ... :(
जोसन Casadellà

19

मैं Android 4.1.1 पर एक ही समस्या में भाग गया। ऐसा लगता है कि यह एक ज्ञात बग है: https://code.google.com/p/android/issues/detail?id=25758

वैसे भी, वर्कअराउंड के रूप में मैंने स्टेट चेंज श्रोता का उपयोग किया (जब SearchView को एक्शन बार से अलग किया जाता है, तो यह भी स्पष्ट रूप से बंद है)।

view.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {

    @Override
    public void onViewDetachedFromWindow(View arg0) {
        // search was detached/closed
    }

    @Override
    public void onViewAttachedToWindow(View arg0) {
        // search was opened
    }
});

उपरोक्त कोड ने मेरे मामले में अच्छा काम किया।


मैं यहां एक ही उत्तर पोस्ट करता हूं: https://stackoverflow.com/a/24573266/2162924


हां, उस प्रश्न को पोस्ट करने के बाद ही वह बग बनाया गया था। मूल प्रश्न पर टिप्पणी देखें।
माइकेल बेक

ओह ठीक है, अभी देखते हैं। लेकिन वैसे भी, हो सकता है कि राज्य परिवर्तन श्रोता के साथ यह समाधान दूसरों के लिए भी उपयोगी हो।
डारियो

जबकि निराशाजनक है कि OnCloseListener काम नहीं करता है जैसा कि आप सोचते हैं, यह वास्तव में एक अच्छा, साफ समाधान है। कुडोस!
वस्त्रकॉपी

10

मैंने एक हैक का उपयोग करके समाप्त किया, जो मेरे उद्देश्य के लिए अच्छी तरह से काम करता है - यह सुनिश्चित नहीं है कि यह सभी उद्देश्यों के साथ काम करेगा। वैसे भी, मैं यह देखने के लिए एक जांच कर रहा हूं कि क्या खोज क्वेरी खाली है। यह वास्तव में से संबंधित नहीं है SearchViewकी OnCloseListenerयद्यपि - कि अभी भी काम नहीं करता है!

searchView.setOnQueryTextListener(new OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText) {
                if (newText.length() > 0) {
                    // Search
                } else {
                    // Do something when there's no input
                }
                return false;
            }
            @Override
            public boolean onQueryTextSubmit(String query) { return false; }
        });

7

खैर, इससे मेरी समस्या हल हो गई:

के साथ मेनू आइटम showAsAction="always"

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

और गतिविधि में

searchView.setOnCloseListener(new OnCloseListener() {

        @Override
        public boolean onClose() {

            Log.i("SearchView:", "onClose");
            searchView.onActionViewCollapsed();
            return false;
        }
    });

1
विशेषता alwaysको मान सेट करना showAsActionसमस्या का हल करता है। महत्वपूर्ण बात यह है कि जब alwaysमूल्य is notमौजूद होता है showAsAction, तो विस्तारित SearchViewबटन क्लोज बटन (क्रॉस आइकन) केवल तब होता है जब क्वेरी SearchViewगैर-अशक्त स्ट्रिंग में हो। SearchView.onCloseClickedहैंडल बंद करें बटन घटनाओं के लिए कि कॉलबैक बताता है कि OnCloseListenerकहा जाता है केवल यदि क्वेरी, रिक्त है अगर यह नहीं है - यह पहले मंजूरी दे दी है - लेकिन फिर, समाशोधन क्वेरी बंद करें बटन गायब होने के बाद और हम वितरित करने में असमर्थ हैं onCloseके लिए कॉलबैकOnCloseListener
bpawlowski

1
बस एक संकेत: इस विधि को कहा जाता है जब उपयोगकर्ता खोज दृश्य को बंद कर देता है (काफी स्पष्ट है, लेकिन मुझे महसूस करने में कुछ समय लगा)। उपयोगकर्ता जिस मुट्ठी पर एक्स क्लिक करता है, वह टेक्स्ट मिटा देता है, और मुझे वह अपडेट नहीं मिला, एक्स पर दूसरे क्लिक पर यह सर्चव्यू को बंद कर देता है और ऑनक्लोज इनवॉइस हो जाता है। आशा करता हूँ की ये काम करेगा!
फेडेरिको अल्वारेज

4

OnCloseListenerकार्य करने के लिए , यह सुनिश्चित करें कि खोज मेनू आइटम में showAsActionसेट किया alwaysगया है।

<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=".SearchActivity">

    <item
        android:id="@+id/search"
        android:title="@string/search"
        android:icon="@drawable/ic_search_toolbar"
        app:showAsAction="always"
        app:actionViewClass="android.support.v7.widget.SearchView"/>
</menu>

2

मैं onCloseListener के साथ वही समस्या का सामना कर रहा हूँ जो SearchView के लिए नहीं है। 25758 में उठाए गए बग मुद्दे से समझें , और कुछ पोस्टिंग जो मैंने पढ़ी हैं, onCloseListener को लागू करने के लिए, आपको सेट करने की आवश्यकता है:

searchView.setIconifiedByDefault(true);

लेकिन मेरे मामले के लिए मैं हर समय खोज दृश्य खोलना चाहता था या नहीं। मैं नीचे एक और पंक्ति जोड़कर इसे हल करने का प्रबंधन करता हूं:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.search_bar, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setOnQueryTextListener(queryTextListener);
    searchView.setIconifiedByDefault(true);
    searchView.setIconified(false);
    return true;
}

पिछली पंक्ति में सही करने के लिए डिफ़ॉल्ट को सेट करने के बावजूद searchView.setIconified (गलत) खोज दृश्य को खोलने का कारण होगा। इस तरह, मैंने दोनों में एक SearchView का प्रबंधन किया है जो हर समय खुलता है और इसे onCloseListener में शामिल करता है।


2

app:showAsActionहमेशा सेट के साथ मेनू आइटम बनाएं ।

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

विधि SearchViewमें बनाते समय onCreateOptionsMenuकुछ ऐसा ही करते हैं

inflater.inflate(R.menu.menu_search, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView search = (SearchView) item.getActionView();
search.setQueryHint(getString(R.string.search_brand_item));
search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  @Override
  public boolean onQueryTextSubmit(String query) {
    // add your code
    return false;
  }

  @Override
  public boolean onQueryTextChange(String newText) {
    // add your code 
    return false;
  }
});
search.setOnCloseListener(new SearchView.OnCloseListener() {
  @Override
  public boolean onClose() {
    // add your code here
    return false;
  }
});
search.setIconifiedByDefault(true); // make sure to set this to true

ऊपर बनाई गई विधि पर कॉल search.setIconifiedByDefault(true)करने के trueलिए सेट करने की आवश्यकता है ।onClose()SearchView.OnCloseListener()



0

कारण OnCloseListenerनहीं कहा जाता है, क्योंकि एंड्रॉइड कोड में एक बग है - श्रोता केवल तभी कहा जाता है यदि आप भी कॉल करते हैं setIconifiedByDefault(true)


7
मैंने सिर्फ setIconifiedByDefault (सत्य) को जोड़ने की कोशिश की, लेकिन इसे नहीं कहा जाता है
Giuseppe

@ जोसेफ अर्ल: मुझे यहाँ एक समान समस्या है: stackoverflow.com/questions/43702055/… । कैसे तय करने के बारे में कोई विचार या विचार?
AJW

0

एक पुराना धागा पहले से ही लगता है, लेकिन मुझे लगा कि मुझे पहली शुरुआत में वही समस्या एपीआई 18 मिली है। चारों ओर गुगली करने के बाद, इस धागे को पाया, एक और घंटे में पढ़े जावदोक को पढ़ने की कोशिश की और किसी ऐसी चीज के लिए जिसे मैं पूरी तरह से जावाडोक में नहीं दिखाऊंगा, मेरे लिए निम्नलिखित काम है:

searchView.setIconifiedByDefault(true);

   // OnQueryTextListener
   @Override
   public boolean onQueryTextSubmit(String query) {
      Log.d(tag, "onQueryTextSubmit: " + query);
      return true;
   }

   @Override
   public boolean onQueryTextChange(String query) {
      Log.d(tag, "onQueryTextChange: " + query);
      return true;
   }

   // OnCloseListener
   @Override
   public boolean onClose() {
      Log.w(tag, "onClose: ");
      return false;
   }

मैं सच / झूठ के साथ थोड़ा खेला, कि किसी तरह फर्क पड़ता है, और यह अब मेरे लिए काम करता है। उम्मीद है, यह किसी को समय बचा सकता है।


0

यह वर्कअराउंड है लेकिन मेरे लिए काम कर गया है

  searchView.setOnQueryTextListener(new android.widget.SearchView.OnQueryTextListener() {

                String lastText;

                @Override
                public boolean onQueryTextChange(final String newText) {
                    if (lastText != null && lastText.length() > 1 && newText.isEmpty()) {
                        // close ctn clicked

                        return true;
                    }
}

0
    searchView.setOnCloseListener {
        d("click", "close clicked")
        return@setOnCloseListener false
    }

अगर आप क्लोज सर्च व्यू -> पर क्लिक करते हैं

डी / क्लिक: क्लोज़ क्लिक


1
कोड की एक बूँद और कुछ गूढ़ शब्दों के साथ उत्तर विशेष रूप से स्पष्ट नहीं है। सिर्फ यह बताने के लिए कि आप इस समस्या को हल क्यों करते हैं, और फिर समाधान के कार्यान्वयन को दिखाने के लिए प्राकृतिक भाषा का उपयोग करें।

0

मुझे इस मुद्दे का सामना करना पड़ा, जब मैं SearchView को दिखा / खारिज करने की कोशिश कर रहा था। मैंने एक अलग श्रोता का उपयोग करके समाप्त किया और इसके लिए मुझे जो चाहिए वह काम किया:

        setOnQueryTextFocusChangeListener { _, hasFocus ->
            if (hasFocus) {
                // SearchView is being shown
            } else {
                // SearchView was dismissed
            }
        }

0

मैंने SearchView क्लोज़ बटन का उपयोग किया और उस पर एक setOnClickListener सेट किया

searchView.findViewById<ImageView>(R.id.search_close_btn).setOnClickListener {
    searchView.setQuery("", false)
    searchView.clearFocus()
}

-2

लॉग इन करने के लिए एंड्रॉइड में कोई कंसोल नहीं है। इसके बजाय, Android लॉगिंग ढांचे का उपयोग करें:

Log.d("Test Tag", "Testing.  1, 2, 3...");

यह प्रश्न भी देखें: एंड्रॉइड में "System.out.println" काम क्यों नहीं करता है?


2
सच नहीं है, यह ठीक काम करता है। कृपया मेरा अद्यतन प्रश्न देखें - मैंने इसे सिद्ध करने के लिए onQueryTextChange पद्धति में एक पंक्ति जोड़ी है। इसके अलावा Log.d () जोड़ने की कोशिश की, लेकिन वह भी कुछ भी प्रदर्शित नहीं किया।
माइकल बेक

मेरी गलती है! जिस तरह से उन्होंने System.out.println से Log.i को आउटपुट करने का फैसला किया है, उसके साथ कहीं न कहीं लगता है। सौभाग्य
क्रिस नाइट

-3

के लिए दो सामान्य पैटर्न हैं SearchView.setOnCloseListener()। यह वास्तव में सभी श्रोताओं का सच है, लेकिन मैं आपके प्रश्न को विशेष रूप से संबोधित कर रहा हूं। पहला तरीका श्रोता फ़ंक्शन बनाना और उसे एक सदस्य चर में संलग्न करना है, और दूसरा तरीका है कि कक्षा को इंटरफ़ेस लागू करना और हैंडलर को सदस्य फ़ंक्शन होना चाहिए।

श्रोता वस्तु बनाना इस तरह दिखता है:

private SearchView mSearchView;
private final SearchView.OnCloseListener mOnCloseListener = 
    new SearchView.OnCloseListener() {
        public boolean onClose() {
            doStuff();
            return myBooleanResult;
        }
    };
mSearchView.setOnCloseListener(mOnCloseListener);

श्रोता वर्ग स्तर पर लागू करना इस प्रकार है:

public class MyClass implements OnCloseListener {
    private SearchView mSearchView;

    public MyClass(...) {
        mSearchView.setOnCloseListener(this);
    }

    @Override
    public boolean onClose() {
        doStuff();
        return false;
    }
}

मैंने ऐसा कोई उदाहरण नहीं देखा है जो OnCloseListenerतदर्थ का निर्माण करता हो , जैसा आपने अपने प्रश्न में किया था।


हे स्पार्की, इस पर टिप्पणी करने के लिए धन्यवाद। मैं वास्तव में नहीं देखता कि कैसे कुछ भी बदलना चाहिए। एक नेस्टेड श्रोता इसे बनाने का एक वैध तरीका है, और यह हनीकॉम्ब पर काम करता है जैसा कि आप यहाँ टिप्पणियों के आधार पर देख सकते हैं। मेरे पास इसके अलावा आईसीएस पर नेस्टेड श्रोताओं के साथ कोई समस्या नहीं है - जो फिर से हनीकॉम्ब पर काम करता है।
माइक बेक

नेस्टेड श्रोताओं से मेरा मतलब अनाम आंतरिक वर्गों से है।
माइक बेक

मैं मानता हूं कि यह बात नहीं होनी चाहिए। मैं केवल इस बारे में टिप्पणी कर रहा हूं कि कोड आधार में क्या मौजूद है। मैं देखूंगा और देखूंगा कि क्या हो सकता है कि जिन स्थितियों में ऑनक्लोज को फिर से परिभाषित किया गया था।
स्पार्कली

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