如何更改 KitKat 中的图标颜色?

How to change icon colors in KitKat?

我无法在搜索视图中更改 KitKat 中的图标颜色。

当我点击工具栏中的搜索图标时,它变成了这样

我点击这个镜头后工具栏变成了这样

你能建议我在 API 19 中让这些图标变白吗? 我可以用这段代码让关闭图标更亮

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

当我将 search_mag_icon 改为 search_close_btn 时,什么也没有发生。

这是我的 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>

试试这个:

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

我会自己回答我的问题。这不是真正合适的解决方案,但在 api 19 上有效,可能会为某人节省很多时间。

onCreateOptionsMenu 中,我添加了这部分以避免您在问题中的图像 1 上看到的视图

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

onCreateOptionsMenu 我正在寻找编辑文本以应用一些样式。我以编程方式设置提示,这会删除此镜头图标。

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

在这种情况下,在您点击搜索按钮后,您会看到像这样展开的工具栏

但是如果您单击关闭图标,您将返回

为了避免这种情况,我重写了 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("");
         }
     }
});

希望对您有所帮助:)

尝试使用此代码更改搜索镜头图像:

int idSearchLens = searchView.getContext()
                .getResources()
                .getIdentifier("android:id/search_button", null, null);
        ImageView searchCloseIcon = (ImageView) searchView.findViewById(idSearchLens);
        searchCloseIcon.setColorFilter(Color.WHITE);
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)
    }
}