2014-07-17 17 views
37

Come posso catturare caso di utente fa clic su una chiara SearchView testo facendo clic sul pulsante X a destraCome si acquisisce il clic del pulsante di ricerca di SearchView?

ho già catturato onQueryTextChange evento, ma, questo è per ogni modifica del testo non per quel pulsante X

+0

Sto anche cercando una risposta a questa domanda. Qualcuno ha un link perché ho cercato le ultime ore su google e non ho trovato nulla. – Sitram

risposta

71

Dopo aver provato un sacco di combinazioni, ho trovato come catturare l'evento dietro il pulsante X in SearchView

Di seguito è riportato un frammento di codice dalla funzione onCreateOptionsMenu in una delle mie app. mSearchMenu e mSearchView sono variabili globali. L'X è in realtà un ImageView con ID search_close_btn e l'area di testo è una vista EditText con ID search_src_text

@SuppressLint("NewApi") 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu items for use in the action bar 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.country_list_activity_actions, menu); 
     mSearchMenu = menu.findItem(R.id.action_search); 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      // Get the SearchView and set the searchable configuration 
      SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
      mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 

      // Assumes current activity is the searchable activity 
      mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
      mSearchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default 

      // Get the search close button image view 
      ImageView closeButton = (ImageView)mSearchView.findViewById(R.id.search_close_btn); 

      // Set on click listener 
      closeButton.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        LoggerUtils.d(LOG, "Search close button clicked"); 
        //Find EditText view 
        EditText et = (EditText) findViewById(R.id.search_src_text); 

        //Clear the text from EditText view 
        et.setText(""); 

        //Clear query 
        mSearchView.setQuery("", false); 
        //Collapse the action view 
        mSearchView.onActionViewCollapsed(); 
        //Collapse the search widget 
        mSearchMenu.collapseActionView(); 
       } 
      }); 
     } 

     // When using the support library, the setOnActionExpandListener() method is 
     // static and accepts the MenuItem object as an argument 
     mSearchMenu.setOnActionExpandListener(new OnActionExpandListener() { 

      @Override 
      public boolean onMenuItemActionExpand(MenuItem item) { 
       //Nothing to do here 
       LoggerUtils.d(LOG, "Search widget expand "); 
       return true; // Return true to expand action view 
      } 

      @Override 
      public boolean onMenuItemActionCollapse(MenuItem item) { 
       LoggerUtils.d(LOG, "Search widget colapsed "); 
       return true; // Return true to collapse action view 
      } 
     }); 

     return super.onCreateOptionsMenu(menu); 
    } 
+0

Ho un problema simile qui: http://stackoverflow.com/questions/43702055/android-how-do-i-get-searchview-close-button-to-return-to-search-edittext?noredirect=1# comment74449117_43702055. mSearchView.onActionViewExpanded() non funziona. Hai qualche idea o idea su come posso risolvere? – AJW

29

ho avuto problemi cercando di trovare il componente dal suo ID, ma ho trovato un altro modo per cercare questa componente utilizzando il contesto della stessa SearchView

// Catch event on [x] button inside search view 
int searchCloseButtonId = searchView.getContext().getResources() 
       .getIdentifier("android:id/search_close_btn", null, null); 
ImageView closeButton = (ImageView) this.searchView.findViewById(searchCloseButtonId); 
// Set on click listener 
closeButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // Manage this event. 
    } 
}); 
+1

ha funzionato, grazie! – deadfish

+1

Funziona, basta non dimenticare di aggiungere 'searchView.setIconified (true);' o 'searchView.setIconified (false);' di conseguenza –

+0

Questo look hackish –

38

si può semplicemente utilizzare l'onCloseListener()

sv= (SearchView) findViewById(R.id.searchView1); 

sv.setOnCloseListener(new OnCloseListener() { 
      @Override 
      public boolean onClose() { 
       Toast t = Toast.makeText(MainActivity.this, "close", Toast.LENGTH_SHORT); 
       t.show(); 

       return false; 
      } 
     }); 
+13

in qualche modo non funziona – deadfish

+0

non vedo alcun motivo per non lavoro. a meno che http://stackoverflow.com/a/14622049/4127670 – spaceMonkey

+2

questa dovrebbe essere la risposta accettata. – commonSenseCode

17

Io uso questo codice per la cattura di query di testo di compensazione, ed eseguire le mie azioni

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

     SearchView searchView = (SearchView) menu.findItem(R.id.search_button).getActionView(); 
     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

     SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextChange(String cs) { 
       if (TextUtils.isEmpty(cs)){ 
        //Text is cleared, do your thing 
       } 
       return false; 
      } 

      @Override 
      public boolean onQueryTextSubmit(String query) { 
       //text query submitted 
      } 
     }; 
     searchView.setOnQueryTextListener(textChangeListener); 

     return true; 
    } 
+0

Gooooooooooood! :) –

+0

Questa risposta dovrebbe essere accettata. –

+0

Semplice ed efficiente. –

2

Se si utilizza biblioteca AppCompat, invece di utilizzare

getResources().getIdentifier("android:id/search_close_btn", null, null); 

si può fare questo:

MenuItem searchItem = menu.findItem(R.id.action_search); 
SearchView searchView = (SearchView) searchItem.getActionView(); 
View closeButton = searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn); 
       closeButton.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         //handle click 
        } 
       }); 
1
ImageView closeButton = (ImageView) this.searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn); 

    closeButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // Manage this event. 


     } 
    }); 

Utilizzare R.id.search_go_btn per il pulsante "Invia"

Problemi correlati