Je fais une application où, par exemple, quand je clique sur l'image (c'est un searchView)
le pavé de recherche s'ouvre!
et ça ressemble à
mais ici l'icône de recherche par défaut (la loupe) s'affiche mais disparaît dès que du texte est entré
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...");
}
}
}
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.
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"
/>
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.
Essayez ces trois lignes:
Android:iconifiedByDefault="false"
Android:searchIcon="@null"
Android:searchHintIcon="@null"
* Cela ne fonctionne que pour Android.widget.SearchView
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();
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/
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;
}
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
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);
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...");
}
}
}