Reputation: 841
I am doing an application where for example when i click on the image(it is a searchView)
the search pad opens !
and it looks like
but here the default search icon (magnifier) gets displayed but this dissappears as soon as some text is entered
but i dont want that magnifier to be displayed even the image is clicked for the first time
and here i am not using any xml file
my code is
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...");
}
}
}
Upvotes: 46
Views: 52627
Reputation: 361
Simply set the searchHintIcon property as null in your Searchview.
<androidx.appcompat.widget.SearchView
app:searchHintIcon="@null" />
Upvotes: 1
Reputation: 41
That's an old question, but this helped me a lot in my case: If you are trying to hide inside a menu, none of the questions posted here worked for me. What solved the problem was: Instead of putting
app:actionViewClass="android.widget.SearchView"
inside the item in menu, you can change for:
app:actionLayout="@layout/search_layout"
And, inside this layout, you can add this piece of code:
<?xml version="1.0" encoding="utf-8"?>
<android.widget.SearchView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/search_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:searchHintIcon="@drawable/nothing_drawed"/>
And, finally, inside the drawable you just create it with nothing inside, example:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
</selector>
Only this method worked for me. When I tried to hide the searchHintIcon, setting to @null or anything else, it remained the same thing as if I had written no code.
Upvotes: 0
Reputation: 176
I know it`s ugly, but it only works for me:
MenuItem menuSearch = menu.findItem(R.id.menu_search);
mSearchView = (SearchView) menuSearch.getActionView();
SearchView.SearchAutoComplete searchAutoComplete = mSearchView.findViewById(androidx.appcompat.R.id.search_src_text);
Class<?> clazz = Class.forName("androidx.appcompat.widget.SearchView$SearchAutoComplete");
SpannableStringBuilder stopHint = new SpannableStringBuilder("");
stopHint.append(getString(R.string.search_hint));
Method setHintMethod = clazz.getMethod("setHint", CharSequence.class);
setHintMethod.invoke(searchAutoComplete, stopHint);
Upvotes: 0
Reputation: 568
For androidx you can do like this
ImageView magImage = (ImageView) searchView.findViewById(androidx.appcompat.R.id.search_mag_icon);
magImage.setVisibility(View.GONE);
magImage.setImageDrawable(null);
It's work for me
Upvotes: 4
Reputation: 579
If you use androidx.appcompat.widget.SearchView:
You can hide the icon using this:
val magImage = searchView.findViewById<View>(androidx.appcompat.R.id.search_mag_icon) as ImageView
magImage.layoutParams = LinearLayout.LayoutParams(0, 0)
Upvotes: 0
Reputation: 3349
Simple solution is searchHintIcon attribute
<style name="SearchViewStyleMyApp" parent="Widget.AppCompat.SearchView">
<!-- Background for the search query section (e.g. EditText) -->
<item name="queryBackground">@android:color/white</item>
<!-- note that this is how you style your hint icon -->
<item name="searchHintIcon">@null</item>
<!-- The hint text that appears when the user has not typed anything -->
<item name="queryHint">@string/search_hint</item>
</style>
Upvotes: 4
Reputation: 185
with v7 Widget , if you use searchView.setIconifiedByDefault(false) the beahvior of the search view differs . You only set hint icon to @null in xml. Also you can apply this manner for other icons.
Upvotes: 0
Reputation: 716
It's answer
ImageView searchViewIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
ViewGroup linearLayoutSearchView =(ViewGroup) searchViewIcon.getParent();
linearLayoutSearchView.removeView(searchViewIcon);
Upvotes: 2
Reputation: 2562
In my app i've used android.support.v7.widget.SearchView
and to hide search icon this worked for me :
<android.support.v7.widget.SearchView
...
app:iconifiedByDefault="false"
app:searchIcon="@null"
/>
Upvotes: 76
Reputation: 1274
Try these three lines:
android:iconifiedByDefault="false"
android:searchIcon="@null"
android:searchHintIcon="@null"
*It works only for android.widget.SearchView
Upvotes: 27
Reputation: 446
Use "searchHintIcon" attribute in your styles for that:
<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>
You can replace @null with any drawable res you want
Upvotes: 2
Reputation: 2394
I've simply put @null to searchHintIcon
attribute:
<style name="SearchViewMy" parent="Widget.AppCompat.Light.SearchView">
<item name="searchHintIcon">@null</item>
</style>
and applied that style in my app theme
<style name="Theme.App" parent="Theme.AppCompat.Light.NoActionBar.FullScreen">
<item name="searchViewStyle">@style/SearchViewMy</item>
</style>
Works for me.
Upvotes: 33
Reputation: 1534
I just met the same problem, here are some reference links.
http://blog.luxteam.net/2013/11/04/styling-appcompat-searchview/
The key is in the following function, it sets the icon as an 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;
}
Upvotes: 4
Reputation: 36289
TL;DR: Simply setting the EditText
's hint to the empty string is enough to remove the hint icon.
I found an answer that actually works. There's a lot of stuff on changing the icon using reflection - such as discussed at Styling the ActionBar SearchView. This website IS a great resource, but unfortunately the search hint ImageView
does not change (even though the reflection does not cause errors). The only way that I was able to remove this image was this:
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();
}
You should place this in your onCreateOptionsMenu
method, and get a reference to your XML
-declared SearchView
using something like:
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
Upvotes: 7
Reputation: 613
I've had trouble with this too. I combined the tutorial I found and an existing answer found here in 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));
Take note that searchView is a LinearLayout, so use LinearLayout.LayoutParams to avoid an exception.
I also tried this but it doesn't remove the view. I can't seem to figure why.:
magImage.setVisibility(View.GONE);
For the other views that you need to change, refer to this tutorial.
Upvotes: 33
Reputation: 1862
you can try this :
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...");
}
}
}
Upvotes: 0