2014-09-09 1 views
3

J'ai utilisé l'extrait suivant pour trouver TextView dans le widget SearchView.Android - ne peut pas trouver TextView à l'intérieur de SearchWidget lors de l'utilisation de la bibliothèque de support Android

int autoCompleteTextViewID = getResources().getIdentifier("android:id/search_src_text", null, null); 
    mQueryTextView = (AutoCompleteTextView) searchView.findViewById(autoCompleteTextViewID); 

Cependant lors du passage à android.support.v7.appcompat bibliothèque de soutien, il ne fonctionne plus.

Je suppose que c'est parce que la bibliothèque de support n'utilise pas le préfixe android: pour "android: id/search_src_text", mais je n'ai aucune idée de ce que cela devrait être. J'ai essayé

getResources().getIdentifier("android.support.v7.appcompat:id/search_src_text", null, null); 

P.S. Plus d'extraits de code:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
     // this xml has funshion:actionViewClass="android.support.v7.widget.SearchView" 
     getMenuInflater().inflate(R.menu.search_activity_actions_v7, menu); 

     android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView) 
       MenuItemCompat.getActionView(menu.findItem(R.id.action_search_v7)); 
     if (searchView==null){ 
      FSLogcat.e(TAG, "searchView is null!"); 
     }else{ 
      SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
      searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
      searchView.setIconifiedByDefault(false); 
      //searchView.requestFocus(); 
      searchView.setSubmitButtonEnabled(true); 

      findSearchViewTextView(searchView); 
      updateSearchViewText(); 
     } 

    return super.onCreateOptionsMenu(menu); 
} 

private void findSearchViewTextView(View searchView) { 
    int autoCompleteTextViewID = getResources().getIdentifier("android:id/search_src_text", null, null); 
    mQueryTextView = (AutoCompleteTextView) searchView.findViewById(autoCompleteTextViewID); 
} 

private void updateSearchViewText() {  
    if (mQueryTextView == null){ 
    } else {  
     mQueryTextView.setText(mQuery); 
    } 

} 

Notez que widget de SearchView rend difficile d'obtenir des suggestions à mettre à l'intérieur TextView

//  in SearchAutoComplete 
//  /** 
//   * We override this method to avoid replacing the query box text when a 
//   * suggestion is clicked. 
//   */ 
//  @Override 
//  protected void replaceText(CharSequence text) { 
//  } 

MISE À JOUR: La nécessité d'une manipulation SearchWidget sont arrivés après SearchResultsActivity a obtenu le SearchWidget comme SearchResultsActivity. Bien que le possible devrait être implémenté comme une activité dans l'itération suivante, pour la version actuelle due cette semaine, j'ai juste besoin de résoudre le problème d'utilisation pour m'assurer que TextView dans SearchWidget sur SearchResultsActivity a toujours la dernière requête.
En d'autres termes, c'est un code critique s'il casse, il sera réécrit, mais certainement pas en clonant un widget standard. Le devrait être d'une autre manière.

+2

Essayez d'utiliser 'AutoCompleteTextView mQueryTextView = (AutoCompleteTextView) mSearchView.findViewById (R.id.search_src_text),' la place –

+0

La bonne réponse est pour vous à la fourchette 'SearchView' et ajoutez ce que vous voulez votre propre copie, plutôt que d'assumer que Google ne changera jamais leur implémentation de manière à briser votre code. – CommonsWare

+0

Eh bien mettre les choses comme ça le mieux est de toujours fourchette bibliothèque de support et l'a utilisé à la place de Google. ;) –

Répondre

8

Comme Pedro Oliveira a suggéré

mQueryTextView = (AutoCompleteTextView) searchView.findViewById(R.id.search_src_text); 

one-liner juste travaillé.

Questions connexes