2012-11-23 3 views
3

J'utilise actuellement ActionBarSherlock 4.2 et c'est SearchView widget dans mon application. Je voulais le faire soumettre une requête même si elle est vide. J'ai essayé de définir imeOptions et OnKeyListener mais les deux ont été ignorés sans raison. OnKey ne se déclenche jamais car les deux entrées Logcat n'apparaissent jamais dans la fenêtre Logcat. Je ne sais pas si c'est à l'intérieur de SherlockFragment est le problème.SearchView imeOptions et support onQueryTextSubmit

Rien de spécial n'est ajouté à l'élément de menu.

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/action_search" 
      android:title="@string/app_name" 
      android:icon="@android:drawable/ic_menu_search" 
      android:showAsAction="always" 
      android:actionViewClass="com.actionbarsherlock.widget.SearchView" /> 
</menu> 

Existe-t-il un moyen de contourner ce problème? Ou existe-t-il un moyen plus simple d'activer la soumission lorsque la requête est vide? Cependant, il ne semble pas supporter de configuration dans le code source.

Répondre

1

Je suis passé à la place de SearchView via ActionMode. Je vais accepter cela comme une réponse pour l'instant jusqu'à ce que quelqu'un ait une meilleure solution pour cette question.

private void showActionMode(){ 
    MainActivity a = (MainActivity)getActivity(); 
    a.startActionMode(new SearchActionMode()); 
} 

private class SearchActionMode implements ActionMode.Callback{ 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     Log.d(TAG, "onCreateActionMode creating inflater"); 
     MenuInflater inflater = new MenuInflater(getActivity()); 
     Log.d(TAG, "onCreateActionMode inflating"); 
     inflater.inflate(R.menu.interactive_map, menu); 
     Log.d(TAG, "onCreateActionMode finding SearchView"); 
     mSearchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 

     Log.d(TAG, "mSearchView: " + mSearchView); 
     setupSearchView(); 
     return true; 
    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     Log.d(TAG, "onPrepareActionMode"); 
     //TODO add searchView once working 
     mSearchView.requestFocus(); 
     return false; 
    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     Log.d(TAG, "onActionItemClicked"); 
     return false; 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
     Log.d(TAG, "onDestroyActionMode"); 
     closeTopTray(); 
     closeListView(); 
    } 

} 


private void setupSearchView() { 

    mSearchView.setIconifiedByDefault(false); 
    mSearchView.setId(ID_SEARCH_VIEW); 
    mSearchView.setOnSearchClickListener(this); 
    mSearchView.setOnQueryTextListener(this); 
    mSearchView.setOnCloseListener(this); 
    mSearchView.setImeOptions(EditorInfo.IME_ACTION_SEARCH); 

    // To automatically display keyboard when display SearchView 
    mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { 

     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      Log.d(TAG, "mSearchView focus changed: " + hasFocus); 
      if (hasFocus) { 
       showInputMethod(v.findFocus()); 
      } 
     } 
    }); 

    mSearchView.setQueryHint("Type keyword"); 
    mSearchView.setQuery((TextUtils.isEmpty(searchQuery)? "": searchQuery), false); 
} 
+0

Voici une autre solution. fonctionne avec moins de code. http://stackoverflow.com/a/32023365/1987045 –

0

J'ai eu le même problème, le problème se trouve onSubmitQuery() dans SearchView.java

private void onSubmitQuery() { 
    CharSequence query = mQueryTextView.getText(); 
    if (query != null && TextUtils.getTrimmedLength(query) > 0) { 

ne sont pas pris en charge de requête vide si je devais télécharger et utiliser ActionBarSherlock puis modifier cette méthode.

Voici comment mon onSubmitQuery() ressemble maintenant

private void onSubmitQuery() { 
    CharSequence query = mQueryTextView.getText(); 
    if (query == null) {query = "";} 
    if (mOnQueryChangeListener == null 
      || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) { 
     if (mSearchable != null) { 
      launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString()); 
      setImeVisibility(false); 
     } 
     dismissSuggestions(); 
    } 
} 

Hope this helps.