web-dev-qa-db-ja.com

SearchViewのクリアボタンの色を設定する

onCreateOptionsMenuを使用してツールバーに検索ビューを作成していますが、クリアなXボタンを最初は白にすることができません。文字を入力し始めると白くなります。また、クリア後も白のままです。

Example of clear button having the color of gray instead of white

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.responsible_menu, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); //TODO: May not be needed?

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
    {
        @Override
        public boolean onQueryTextSubmit(String query)
        {
            mAdapter.updateUIWithFilter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText)
        {
            mAdapter.updateUIWithFilter(newText);
            return false;
        }
    });

    // Does not work! Still not white.
    ImageView searchClose = (ImageView) searchView.findViewById(Android.support.v7.appcompat.R.id.search_close_btn);
    searchClose.setColorFilter(Color.argb(255, 255, 255, 255));

    searchClose.setAlpha(255);

    return true;
}

responsible_menu.xml:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
      xmlns:appcompat="http://schemas.Android.com/apk/res-auto"
      xmlns:app="http://schemas.Android.com/tools">

    <item
        Android:id="@+id/menu_search"
        Android:title="@string/search"
        appcompat:actionViewClass="Android.support.v7.widget.SearchView"
        appcompat:showAsAction="always"/>

</menu>
12
Sunkas

解決策を見つけました。しかし、より良いものに興味があります。

https://www.google.com/design/icons/#ic_clear から「クリアボタン」の画像を24ポイントの白でダウンロードし、このコードをonCreateOptionsMenuの末尾に追加しました

    // Does help!
    ImageView searchClose = (ImageView) searchView.findViewById(Android.support.v7.appcompat.R.id.search_close_btn);
    searchClose.setImageResource(R.drawable.ic_clear_white_24dp);
21
Sunkas

これを試して:

    ImageView searchClose = searchView.findViewById(Android.support.v7.appcompat.R.id.search_close_btn);
    searchClose.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
4
MacaronLover

XMLから設定することもできます。サポートライブラリ24.2.1と、親が「Theme.AppCompat.Light」であるテーマのアクティビティと、ActionBarのAndroid.support.v7.widget.SearchViewを使用しています。

次のように、アクティビティテーマにactionBarWidgetThemeを設定できます。

<style name="ActivityTheme" parent="Theme.AppCompat.Light">
    <item name="actionBarWidgetTheme">@style/MyActionBarWidgetTheme</item>
</style>

次に、MyActionBarWidgetThemeを定義し、必要な色を設定します。

<style name="MyActionBarWidgetTheme">
    <item name="Android:textColorSecondary">@Android:color/white</item>
</style>
  • Android:textColorSecondaryは閉じるアイコンに適用されます

  • Android:textColorPrimaryは、入力したテキストに適用されます

  • colorControlActivatedはカーソルに適用されます

  • Android:textColorHintはヒントテキストに適用されます

4
Bea

Searchviewのデフォルトのキャンセルアイコンの代わりに、独自のカスタムアイコンを使用できます。

私はうまく機能する以下のコードを使用しました、それがあなたのために機能することを願っています。

private void setCloseSearchIcon(SearchView searchView) {
        try {
            Field searchField = SearchView.class.getDeclaredField("mCloseButton");
            searchField.setAccessible(true);
            ImageView closeBtn = (ImageView) searchField.get(searchView);
            closeBtn.setImageResource(R.drawable.ic_close);

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

これは、APIレベル14より上で機能します。

Kotlin

private fun configureCloseButton(searchView: SearchView) {
    val searchClose =  searchView.javaClass.getDeclaredField("mCloseButton")
    searchClose.isAccessible = true
    val closeImage = searchClose.get(searchView) as ImageView
    closeImage.setImageResource(R.drawable.arrow_back_gray) // your image here
}
1
Silvans Solanki