在searchView中删除SearchIcon作为提示

我正在做一个应用程序,例如当我点击图像时(它是一个searchView)

在此处输入图像描述

搜索板打开!

它看起来像 在此处输入图像描述

但是这里会显示默认搜索图标(放大镜),但只要输入了一些文字,这个就会消失

在此处输入图像描述

但我不希望显示放大镜,即使是第一次点击图像

这里我没有使用任何xml文件

我的代码是

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..."); } } } 

Solutions Collecting From Web of "在searchView中删除SearchIcon作为提示"

我也遇到过麻烦。 我结合了我find的教程和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)); 

请注意,searchView是一个LinearLayout,因此请使用LinearLayout.LayoutParams来避免exception。

我也试过了,但它没有删除视图。 我似乎无法想象为什么:

 magImage.setVisibility(View.GONE); 

对于您需要更改的其他视图,请参阅本教程。

在我的应用程序中,我使用了android.support.v7.widget.SearchView并隐藏了对我有用的搜索图标:

  

我只是将@null放到searchHintIcon属性中:

  

并在我的应用主题中应用该样式

  

适合我。

试试这三行:

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

*它仅适用于android.widget.SearchView

TL; DR:只需将EditText的提示设置为空字符串即可删除提示图标。

我find了一个实际有效的答案。 使用reflection更改图标有很多内容 – 例如在Styling ActionBar SearchView中讨论过。 这个网站一个很好的资源,但不幸的是搜索提示ImageView不会改变(即使reflection不会导致错误)。 我能够删除此图像的唯一方法是:

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

您应该将它放在onCreateOptionsMenu方法中,并使用以下内容获取对XML -declared SearchView的引用:

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

我刚遇到同样的问题,这里有一些参考链接。

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

关键是在以下function中,它将图标设置为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; } 

在样式中使用“searchHintIcon”属性:

   

您可以将@null替换为您想要的任何可绘制的res

你可以试试这个:

  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..."); } } }