web-dev-qa-db-ja.com

searchviewアイコンの色を変更するにはどうすればよいですか?

この質問に対する回答はすでにたくさんあることを私は知っています。ここで見たすべてをまだ試していなければ、別のスレッドを作成することはありません。とにかく、質問は非常に簡単です。解決策がXMLスタイリングによるものなのかJavaコード(どちらの解決策も歓迎))なのかは関係ありません。解決しようとしたすべてのこと(とにかくほとんど)を示します。

まず、searviewアイコンは何も変更できないため、コードによって不変のようです。私の検索ビューは_menu.xml_で次のように宣言されています

_<item Android:id="@+id/icon_search"
    Android:title="Searchador"
    Android:icon="@drawable/ic_search_black_24dp" <!-- icon not used by searchview anyway -->
    Android:showAsAction="always"
    Android:actionViewClass="Android.widget.SearchView"
/>
_

そして私のonCreateOptionsMenuの中に私はこれを持っています

_SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchMenuItem = menu.findItem(R.id.icon_search);
searchView = (SearchView) searchMenuItem.getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setSubmitButtonEnabled(false);
searchView.setOnQueryTextListener(this);
MenuTint.colorIcons(this, menu, Color.BLUE);
return true;
_

見つけた特別なクラスから取得したMenuTint.colorIcons(this, menu, Color.BLUE);here 基本的にすべてのアイコンの色が変更されますが、残念ながらsearchviewアイコンでは機能しません。

次に、このようなスタイルを使用することを提案するいくつかの回答を見つけました

_<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView">
   <!-- changing my icon, its color and stuff.. -->
   <item name="searchIcon">@drawable/ic_search</item></style>
_

しかし、_No resource found that matches the given name 'Widget.AppCompat.SearchView'._エラーが発生していました。

次に、_Android-support-app-compat_だけでなく、_.jar_プロジェクトライブラリを追加する必要があることがわかりました。それはうまくいきませんでした。つまり、インポートは機能しましたが、エラーが表示され続けました。次に、_project.properties_をtarget = Android-19から21(またはそれ以上)に変更する必要があることをどこかで見つけましたが、「リソースが見つかりません」というエラーは解決しませんでした。

そのため、検索ビューの色を変更する必要があるこの単純な詳細にかなり悩まされています。

また、これはまったく同じ質問ではありませんが、同じ方法で解決できると思うので、ここに含めます。アイコン間の距離を変更したかったのです。誰かがこの解決策を提案しました

_<style name="ActionButtonStyle" parent="AppBaseTheme">
    <item name="Android:minWidth">0dip</item>
    <item name="Android:paddingLeft">0dip</item>
    <item name="Android:paddingRight">0dip</item>                  
</style>
_

しかし、私は最終的に this

ご覧のとおり、このアプローチは私のカスタムアイコンでのみ機能しますが、検索ビューアイコンでは機能せず、メニューオーバーフローアイコンでも機能しません。すべてのアイコン間の距離を均等に変更したいと思います。

4

SearchViewの検索アイコンを変更する場合は、次のようにビュー内で画像ビューを取得する必要があります。

searchView = v.findViewById(R.id.searchView);
//change icon color
ImageView searchIcon = searchView.findViewById(Android.support.v7.appcompat.R.id.search_button);
searchIcon.setImageDrawable(ContextCompat.getDrawable(getActivity(),R.drawable.ic_search_icon));

アイコンがR.id.search_buttonであることが重要であり、指定した白いベクターアセット(この場合はR.drawable.ic_search_icon)に置き換えることができます。

同様に、SearchView内のテキストを次のように変更できます。

//set color to searchview
SearchView.SearchAutoComplete searchAutoComplete = searchView.findViewById(Android.support.v7.appcompat.R.id.search_src_text);
searchAutoComplete.setHintTextColor(getResources().getColorandroid.R.color.white));
searchAutoComplete.setTextColor(getResources().getColor(Android.R.color.white));
4
Carlos Daniel

検索ビューのアイコンの色を変更するには、次のコード行を使用します。

SearchView searchView = (SearchView) findViewById(R.id.searchview);
ImageView icon = searchView.findViewById(Android.support.v7.appcompat.R.id.search_button);
icon.setColorFilter(Color.BLACK);
4
adougies
 final SearchView searchViewAndroidActionBar = (SearchView) MenuItemCompat.getActionView(searchViewItem);
        // change close icon color
        ImageView iconClose = (ImageView) searchViewAndroidActionBar.findViewById(Android.support.v7.appcompat.R.id.search_close_btn);
        iconClose.setColorFilter(getResources().getColor(R.color.grey));
       //change search icon color
        ImageView iconSearch = searchViewAndroidActionBar.findViewById(Android.support.v7.appcompat.R.id.search_button);
        iconSearch.setColorFilter(getResources().getColor(R.color.grey));
1
Naseer Attari

着色したいDrawableを取り、着色されたDrawableでラップし、検索メニュー項目の新しいものとして設定します。

@JvmStatic
fun getTintedDrawable(inputDrawable: Drawable, @ColorInt color: Int): Drawable {
    val wrapDrawable = DrawableCompat.wrap(inputDrawable.mutate())
    DrawableCompat.setTint(wrapDrawable, color)
    DrawableCompat.setTintMode(wrapDrawable, Mode.SRC_IN)
    return wrapDrawable
}

使用法:

val drawable =getTintedDrawable(...)
searchMenuItem.icon = drawable

そして、これはAndroid-x(サポートライブラリ)がサポートするすべてのAndroidバージョンで機能するはずです。

0