How to change icon colors in KitKat?

410 views Asked by At

I have troubles to change icon colors in KitKat inside the search view.

When I click on search icon in my toolbar it becomes like this

enter image description here

After I click on this lens toolbar transforms like this

enter image description here

Could you suggest me any way to make those icons white in API 19? I can make close icon lighter with this code

  int idSearchCloseIcon = searchView.getContext()
      .getResources()
      .getIdentifier("android:id/search_close_btn", null, null);
  ImageView searchCloseIcon = (ImageView) searchView.findViewById(idSearchCloseIcon);
  searchCloseIcon.setColorFilter(Color.WHITE);

When I put search_mag_icon instead search_close_btn nothing happens at all.

Here is my menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/action_search"
        android:title="@string/toolbar_menu_search"
        android:icon="@drawable/ic_search_white_48dp"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="android.widget.SearchView" />

    <item
        android:id="@+id/action_contact"
        app:showAsAction="never"
        android:title="@string/toolbar_menu_contact"
        android:icon="@drawable/ic_contact_mail_white_48dp">
    </item>

    <item
        android:id="@+id/action_about"
        app:showAsAction="never"
        android:title="@string/toolbar_menu_about">
    </item>
</menu>
4

There are 4 answers

0
Vitalii On BEST ANSWER

I'll answer to my question myself. It's not really proper solution but in works on api 19 and probably it will save a lot of time for someone.

In onCreateOptionsMenu I added this part to avoid the view that you see on image 1 in a question

 searchView.setIconifiedByDefault(true);
 searchView.setFocusable(true);
 searchView.setIconified(false);
 searchView.clearFocus();
 searchView.requestFocusFromTouch();

Than in the same onCreateOptionsMenu I'm looking for edit text to apply some styling. I set hint programmatically and this removes this lens icon.

 // EditText styling
 int idSearchTextView = searchView.getContext()
     .getResources()
     .getIdentifier("android:id/search_src_text", null, null);
 final EditText editText = searchView.findViewById(idSearchTextView);
 if (editText != null) {
     editText.setTextColor(getResources()
          .getColor(R.color.primaryTextColor));                
     setCursorColor(editText,getResources()
          .getColor(R.color.primaryTextColor));
     // this is done to remove icon from a hint!!!!
     editText.setHint(getString(R.string.home_search_input_hint));
 } 

In this case after you click on search button you'll see expanded toolbar like this

enter image description here

But if you click close icon you'll be back to

enter image description here

To avoid this I override on clock event of close button in onCreateOptionsMenu

 int idSearchCloseIcon = searchView.getContext()
    .getResources()
    .getIdentifier("android:id/search_close_btn", null, null);
 ImageView searchCloseIcon = (ImageView) searchView.findViewById(idSearchCloseIcon);
 // add this listener to avoid return on view with lens icon
 searchCloseIcon.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         if(editText != null){
             editText.setText("");
         }
     }
});

Hope it helps :)

3
tim.paetz On

Try this:

ImageView searchHintIcon = (ImageView) searchView.findViewById(idSearchCloseIcon);

Drawable newIcon = searchView.getDrawable();

if (newIcon != null) {
    newIcon.mutate().setColorFilter(Color.WHITE,
                            PorterDuff.Mode.SRC_IN);

    searchHintIcon.setDrawable(newIcon);
}
2
Imene Noomene On

Try this code to change the search lens image :

int idSearchLens = searchView.getContext()
                .getResources()
                .getIdentifier("android:id/search_button", null, null);
        ImageView searchCloseIcon = (ImageView) searchView.findViewById(idSearchLens);
        searchCloseIcon.setColorFilter(Color.WHITE);
0
guest On
fun Drawable.setDrawableTint(context: Context, @ColorRes colorRes: Int) {
    val color = context.getColorByRes(colorRes)
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        DrawableCompat.setTint(this.mutate(), color)
    } else {
        val color = context.getColorByRes(colorRes)
        val drawable = this.mutate().apply {
            setColorFilter(color, PorterDuff.Mode.SRC_IN);
        }
        DrawableCompat.setTint(drawable, color)
    }
}