web-dev-qa-db-fra.com

Android ActionBar Personnaliser l’affichage de la recherche

--- 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:

  1. 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.

  2. 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.

enter image description here

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. :-)

44
Tobias Reich

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);
29
ademar111190

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);
}
15
prcaen

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>

Before click search button

After click search button

<SearchView
                Android:id="@+id/searchView"
                Android:layout_width="match_parent"
                Android:queryHint="Serach"
                Android:layout_height="match_parent"></SearchView>
4
Naveen Kumar M

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()

1
alfred abalos