Удалите SearchIcon в качестве подсказки в searchView
Я делаю приложение, например, когда я нажимаю на изображение (это searchView)
![enter image description here]()
откроется панель поиска!
и похоже
![enter image description here]()
но здесь отображается значок поиска по умолчанию (лупа), но это исчезает, как только вводится какой-либо текст
![enter image description here]()
но я не хочу, чтобы эта лупа отображалась даже при первом щелчке изображения.
и здесь я не использую какой-либо файл 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...");
}
}
}
Ответы
Ответ 1
У меня тоже были проблемы с этим. Я объединил найденный учебник и существующий ответ, найденный здесь в 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, чтобы избежать исключения.
Я также пробовал это, но он не удаляет представление. Я не могу понять, почему.:
magImage.setVisibility(View.GONE);
Для других представлений, которые вам нужно изменить, откройте к этому руководству.
Ответ 2
В моем приложении я использовал android.support.v7.widget.SearchView
и чтобы скрыть значок поиска, это сработало для меня:
<android.support.v7.widget.SearchView
...
app:iconifiedByDefault="false"
app:searchIcon="@null"
/>
Ответ 3
Я просто добавил атрибут @null в searchHintIcon
:
<style name="SearchViewMy" parent="Widget.AppCompat.Light.SearchView">
<item name="searchHintIcon">@null</item>
</style>
и применил этот стиль в моей теме приложения
<style name="Theme.App" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
<item name="searchViewStyle">@style/SearchViewMy</item>
</style>
Работает для меня.
Ответ 4
Попробуйте эти три строки:
android:iconifiedByDefault="false"
android:searchIcon="@null"
android:searchHintIcon="@null"
* Он работает только для android.widget.SearchView
Ответ 5
TL; DR: просто установить подсказку EditText
на пустую строку достаточно, чтобы удалить значок подсказки.
Я нашел ответ, который действительно работает. Там много материала об изменении значка с использованием отражения - например, обсуждалось в Styling ActionBar SearchView. Этот сайт - отличный ресурс, но, к сожалению, подсказка поиска ImageView
не изменяется (хотя отражение не вызывает ошибок). Единственный способ удалить это изображение:
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();
Ответ 6
Я только что встретил ту же проблему, вот некоторые ссылки ссылки.
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
Ключ находится в следующей функции, он устанавливает значок как 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;
}
Ответ 7
Используйте атрибут "searchHintIcon" в ваших стилях для этого:
<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>
Вы можете заменить @null на любые доступные выходы
Ответ 8
вы можете попробовать следующее:
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...");
}
}
}