--- RESOLU LES PROBLEMES - AJOUTES LES REPONSES DANS LE TEXTE EDIT ---
J'utilise le ActionBar
Sherlock dans mon Android App. Je veux montrer un SearchView
. Cela fonctionne très bien jusqu'à présent, mais je réalise que je m faire quelque chose de mal en essayant de le personnaliser.
Je le crée de cette façon:
searchView.setQueryHint("Search: ");
searchView.setOnQueryTextListener(this);
searchView.setOnCloseListener(...);
searchMenuItem = menu.add("Search place");
searchMenuItem.setIcon(R.drawable.ic_action_search)
.setActionView(searchView)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
Je veux faire deux choses:
Changez la couleur du texte "Recherche" qui apparaît dans le champ de texte qui apparaît. On dirait que je l'ai modifié avec le style de texte général de mon thème, mais j'espère pouvoir définir une couleur distincte d'une manière ou d'une autre.
Lorsque vous ouvrez cette vue de recherche, elle apparaît sur le côté gauche de la barre d’action. Mais j'en ai besoin du bon côté. L'icône (la loupe) se trouve en réalité sur le côté droit de la barre, mais une pression sur celle-ci ouvre le champ de texte Edit situé sur le côté gauche. J'ai essayé d'utiliser LayoutParams mais il me manque quelque chose d'essentiel lorsque j'essaie de l'ajouter à la barre d'actions en utilisant LayoutParams.
Alors j'espère que quelqu'un pourra m'aider avec ça.
Merci beaucoup, Tobias
---- EDIT ----
Ok, donc une chose est déjà résolue avec ça. L'ajout de l'ActionBar par XML place TextEdit à droite.
getSupportMenuInflater().inflate(R.menu.activity_main, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
Log.e(TAG, "searchView: " + searchView);
Et dans mon menu.xml
<item Android:id="@+id/action_search"
Android:title="Search"
Android:icon="@drawable/ic_action_search"
Android:showAsAction="always"
Android:actionViewClass="com.actionbarsherlock.widget.SearchView" />
Donc, au moins un mystère résolu (pourquoi jamais cela a fait une différence). Mais le XML nouvellement créé ne se ferme plus lors de l'appel
searchMenuItem.collapseActionView();
Donc, il y a encore quelque chose qui ne va pas.
--- EDIT 2 ---
Juste pour que tu saches. J'ai trouvé la solution pour la couleur du texte. Pour ce faire, utilisez l’AutoCompleteTextView de SearchView:
AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text);
searchText.setHintTextColor(getResources().getColor(R.color.white));
searchText.setTextColor(getResources().getColor(R.color.white));
Donc, le dernier problème que j'ai, c'est que SearchView ne ferme plus lors de la soumission d'un texte. Donc, collapseActionView (), etc. ne fonctionne pas. Des idées?
--- EDIT 3 ---
Ok, j'ai trouvé une solution. Je ne sais pas si c'est la bonne façon de le faire, mais en utilisant
((SearchView) searchMenuItem.getActionView()).setIconified(true);
il ferme le EditText
Je dois le faire deux fois parce que la première fois ne fait que "supprimer" mon texte d'entrée et affiche le "conseil", tandis que la deuxième utilisation "ferme" le texte d'édition et réduit le searchView à la loupe. Style maladroit mais ça marche. :-)
J'ai fait un cours SearchViewFormatter pour formater facilement le widget SearchView natif Android widget. Un exemple:
new SearchViewFormatter()
.setSearchBackGroundResource(R.drawable.my_bg)
.setSearchIconResource(R.drawable.my_ic, true, false) //true to icon inside edittext, false to outside
.setSearchVoiceIconResource(R.drawable.my_ic)
.setSearchTextColorResource(R.color.my_color)
.setSearchHintColorResource(R.color.my_color)
.setSearchCloseIconResource(R.drawable.my_ic)
.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS)
.format(mSearchView);
FYI maintenant avec le support ActionBar v7 appcompat la voie pour changer la couleur de conseil de requête, couleur de texte, taille de texte:
import Android.support.v4.view.MenuItemCompat;
import Android.support.v7.widget.SearchView;
import Android.support.v7.widget.SearchView.SearchAutoComplete;
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_home, menu);
MenuItem searchItem = menu.findItem(R.id.item_search);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
mSearchView.setOnQueryTextListener(this);
mSearchView.setQueryHint(getString(R.string.text));
SearchAutoComplete searchAutoComplete = (SearchAutoComplete) mSearchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text);
searchAutoComplete.setHintTextColor(mRes.getColor(Android.R.color.white));
searchAutoComplete.setTextSize(14);
return super.onCreateOptionsMenu(menu);
}
J'ai fait le coin arrondi pour éditer le texte comme ceci.
int searchPlateId = searchView.getContext().getResources().getIdentifier("Android:id/search_plate", null, null);
View searchPlate = searchView.findViewById(searchPlateId);
searchPlate.setBackgroundResource(R.drawable.bg_white_rounded);
int searchSrcTextId = getResources().getIdentifier("Android:id/search_src_text", null, null);
EditText searchEditText = (EditText) searchView.findViewById(searchSrcTextId);
searchEditText.setTextColor(Color.BLACK);
searchEditText.setHintTextColor(Color.LTGRAY);
int closeButtonId = searchView.getContext().getResources().getIdentifier("Android:id/search_close_btn", null, null);
ImageView closeButtonImage = (ImageView) searchView.findViewById(closeButtonId);
closeButtonImage.setColorFilter(ContextCompat.getColor(MainActivity.this, R.color.colorPrimary), PorterDuff.Mode.SRC_IN);
bg_white_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid Android:color="#ffffff"/>
<corners Android:radius="8dp"/>
</shape>
<SearchView
Android:id="@+id/searchView"
Android:layout_width="match_parent"
Android:queryHint="Serach"
Android:layout_height="match_parent"></SearchView>
Pour résoudre votre question numéro 2
Changer cette ligne:
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
À:
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
utiliser uniquement le paramètre SHOW_AS_ACTION_IF_ROOM
sur la méthode setShowAsAction()