web-dev-qa-db-fra.com

Supprimez SearchIcon comme indice dans searchView

Je fais une application où, par exemple, quand je clique sur l'image (c'est un searchView) 

enter image description here

le pavé de recherche s'ouvre!

et ça ressemble à enter image description here

mais ici l'icône de recherche par défaut (la loupe) s'affiche mais disparaît dès que du texte est entré

enter image description here

mais je ne veux pas que cette loupe soit affichée même l'image est cliquée pour la première fois

et ici je n'utilise aucun fichier xml 

mon code est 

public class MainActivity extends Activity {

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        RelativeLayout relative = new RelativeLayout(this);
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        relative.setLayoutParams(params);
        setContentView(relative);

        SearchView searchView = new SearchView(this);
        traverseView(searchView, 0);
//      searchView.setIconifiedByDefault(false);
        LayoutParams searchViewparams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
//      searchViewparams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        searchView.setLayoutParams(searchViewparams);
        relative.addView(searchView);
    }
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressLint("NewApi")
    private void traverseView(View view, int index) {
        if (view instanceof SearchView) {
            SearchView v = (SearchView) view;
            for(int i = 0; i < v.getChildCount(); i++) {
                traverseView(v.getChildAt(i), i);
            }
        } else if (view instanceof LinearLayout) {
            LinearLayout ll = (LinearLayout) view;
            for(int i = 0; i < ll.getChildCount(); i++) {
                traverseView(ll.getChildAt(i), i);
            }
        } else if (view instanceof EditText) {
            ((EditText) view).setTextColor(Color.GREEN);
            ((EditText) view).setHintTextColor(Color.BLACK);
        } else if (view instanceof TextView) {
            ((TextView) view).setTextColor(Color.BLUE);
        } else if (view instanceof ImageView) {
            ((ImageView) view).setImageResource(R.drawable.ic_launcher);
        } else {
            Log.v("View Scout", "Undefined view type here...");
        }
    }
}
26
Hummer

J'ai aussi eu des problèmes avec ça. J'ai combiné le tutoriel que j'ai trouvé et une réponse existante trouvée ici dans stackoverflow.

int magId = getResources().getIdentifier("Android:id/search_mag_icon", null, null);
ImageView magImage = (ImageView) searchView.findViewById(magId);
magImage.setLayoutParams(new LinearLayout.LayoutParams(0, 0));

Notez que searchView est un LinearLayout, utilisez donc LinearLayout.LayoutParams pour éviter une exception.

J'ai aussi essayé cela mais cela ne supprime pas la vue. Je n'arrive pas à comprendre pourquoi.

magImage.setVisibility(View.GONE);

Pour les autres vues que vous devez modifier, reportez-vous à de ce didacticiel.

24
chjarder

Dans mon application, j'ai utilisé Android.support.v7.widget.SearchView et pour masquer l'icône de recherche, cela a fonctionné pour moi:

<Android.support.v7.widget.SearchView
    ...
    app:iconifiedByDefault="false"
    app:searchIcon="@null"
/>
35
Armin

J'ai simplement mis l'attribut @null to searchHintIcon:

<style name="SearchViewMy" parent="Widget.AppCompat.Light.SearchView">
    <item name="searchHintIcon">@null</item>
</style>

et appliqué ce style dans mon thème d'application

<style name="Theme.App" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
    <item name="searchViewStyle">@style/SearchViewMy</item>
</style>

Travaille pour moi.

20
Tomask

Essayez ces trois lignes:

Android:iconifiedByDefault="false"
Android:searchIcon="@null"
Android:searchHintIcon="@null"

* Cela ne fonctionne que pour Android.widget.SearchView

13
Silvio Guedes

TL; DR: Il suffit de définir l'indicateur de la EditText sur la chaîne vide pour supprimer l'icône de l'indicateur.

J'ai trouvé une réponse qui fonctionne réellement. Il y a beaucoup de choses sur la modification de l'icône en utilisant la réflexion - telle que discutée à Styling the ActionBar SearchView . Ce site Web EST est une excellente ressource, mais malheureusement, l'indicateur de recherche ImageView ne change pas (même si le reflet ne provoque pas d'erreur). La seule façon dont j'ai pu supprimer cette image était la suivante:

try {
    int searchPlateId = searchView.getContext().getResources().getIdentifier("Android:id/search_src_text", null, null);
    EditText searchPlate = (EditText) searchView.findViewById(searchPlateId);
    searchPlate.setHint("");
}
catch (Throwable t)
{
    t.printStackTrace();
}

Vous devriez placer ceci dans votre méthode onCreateOptionsMenu et obtenir une référence à votre XML- déclarée SearchView en utilisant quelque chose comme:

SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
5
Phil

Je viens de rencontrer le même problème, voici quelques liens de référence.

http://blog.luxteam.net/2013/11/04/styling-appcompat-searchview/

https://Android.googlesource.com/platform/frameworks/support.git/+/Android-support-lib-19.1.0/v7/appcompat/src/Android/support/v7/widget/SearchView.Java

La clé est dans la fonction suivante, elle définit l'icône en tant que ImageSpan.

private CharSequence getDecoratedHint(CharSequence hintText) {
    // If the field is always expanded, then don't add the search icon to the hint
    if (!mIconifiedByDefault) return hintText;

    SpannableStringBuilder ssb = new SpannableStringBuilder("   "); // for the icon
    ssb.append(hintText);
    Drawable searchIcon = getContext().getResources().getDrawable(getSearchIconId());
    int textSize = (int) (mQueryTextView.getTextSize() * 1.25);
    searchIcon.setBounds(0, 0, textSize, textSize);
    ssb.setSpan(new ImageSpan(searchIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return ssb;
}
4
Chao Zhang

Utilisez l'attribut "searchHintIcon" dans vos styles pour cela:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="searchViewStyle">@style/AppTheme.SearchView</item>
</style>

<style name="AppTheme.SearchView" parent="Widget.AppCompat.SearchView">
    <item name="searchHintIcon">@null</item>
</style>

Vous pouvez remplacer @null par n'importe quelle résolution que vous souhaitez

2
Vladimir Farafonov

C'est la réponse

ImageView searchViewIcon = (ImageView)searchView.findViewById(Android.support.v7.appcompat.R.id.search_mag_icon);

ViewGroup linearLayoutSearchView =(ViewGroup) searchViewIcon.getParent();
linearLayoutSearchView.removeView(searchViewIcon);
1
roghayeh hosseini

vous pouvez essayer ceci:

  public class MainActivity extends Activity {

        @SuppressLint("NewApi")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            RelativeLayout relative = new RelativeLayout(this);
            LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
            relative.setLayoutParams(params);
            setContentView(relative);

            SearchView searchView = new SearchView(this);
searchView.setIconifiedByDefault(false);
            traverseView(searchView, 0);
    //      searchView.setIconifiedByDefault(false);
            LayoutParams searchViewparams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
    //      searchViewparams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
            searchView.setLayoutParams(searchViewparams);
            relative.addView(searchView);
        }
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @SuppressLint("NewApi")
        private void traverseView(View view, int index) {
            if (view instanceof SearchView) {
                SearchView v = (SearchView) view;
                for(int i = 0; i < v.getChildCount(); i++) {
                    traverseView(v.getChildAt(i), i);
                }
            } else if (view instanceof LinearLayout) {
                LinearLayout ll = (LinearLayout) view;
                for(int i = 0; i < ll.getChildCount(); i++) {
                    traverseView(ll.getChildAt(i), i);
                }
            } else if (view instanceof EditText) {
                ((EditText) view).setTextColor(Color.GREEN);
                ((EditText) view).setHintTextColor(Color.BLACK); 
            } else if (view instanceof TextView) {
                ((TextView) view).setTextColor(Color.BLUE);
            } else if (view instanceof ImageView) {
                ((ImageView) view).setImageResource(R.drawable.ic_launcher);
            } else {
                Log.v("View Scout", "Undefined view type here...");
            }
        }
    }
0
Harshit Rathi