web-dev-qa-db-ja.com

Androidツールバーを使用してSearchViewのTextColorを変更する

次の問題があります。 appcompat-v7:21でAPI 21を使用する代わりに、ツールバーを使用するようにアクションバーを設定しました。 textColorPrimaryスタイルタグは色@Android:color/whiteを使用するように構成されているため、新しいAndroidツールバーのすべてのタイトルは白いテキスト色になります(これまでのところ良好です) )。

これで、SearchViewを追加し、次のようにカスタム背景を設定しました。

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/action_bar_background</item>
    <item name="colorPrimaryDark">@color/status_background</item>
    <item name="Android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="Android:textColorPrimary">@Android:color/white</item>
    <item name="searchViewStyle">@style/SearchViewStyle</item>
</style>

<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView">
    <item name="queryBackground">@drawable/search_background</item>
    <item name="searchIcon">@drawable/icon_search</item>
</style>

ドローアブル@drawable/search_backgroundは真っ白な長方形です。だから何を推測しますか?ツールバーのタイトルテキストの色が白であるため、SearchViewのテキストの色も白になり、SearchViewの背景が白い長方形であるため、ユーザーは入力内容を確認できません。

私の質問は次のとおりです。AndroidツールバーのタイトルとSearchViewテキストに異なるテキストの色を設定するにはどうすればよいですか?

11
David_E

いくつかの調査の後、私はそれを行うための安全な方法を見つけました。

SearchViewスタイルを掘り下げてみると、SearchViewの表示に使用されているレイアウトが見つかりました。そのレイアウト内には、TextView(SearchViewに入力する実際のフィールド)があります。

<TextView
        Android:id="@+id/search_badge"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:gravity="center_vertical"
        Android:layout_marginBottom="2dip"
        Android:drawablePadding="0dip"
        Android:textAppearance="?android:attr/textAppearanceMedium"
        Android:textColor="?android:attr/textColorPrimary"
        Android:visibility="gone" />

フィールドAndroid:textColor="?android:attr/textColorPrimary"に注目してください。これにより、私が最初に抱えていた問題が発生します。SearchViewのテキストの色は、Androidツールバーのタイトルのテキストの色に定義されているものと同じです。

今、うまくいくかもしれないいくつかの解決策があります ここ 、しかし私はそれらの解決策のほとんどが同じ問題を抱えていると思います。説明されているように、ビューにアクセスしてテキストの色を変更するために、これらはすべてTextViewのIDに依存しています ここ

個人的には、コード内にTextViewのIDをハードコーディングすることは非常に危険だと思います。明日、Googleがこのビューに別のID値を使用することを決定したかどうかわからないためです。その場合、コードは壊れます。

そのため、SearchViewでTextViewオブジェクトを取得し、色を必要に応じて変更する再帰メソッドを作成しました。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.search, menu);
    SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();

    searchView.setOnQueryTextListener(new SearchTextListener());
    changeSearchViewTextColor(searchView);
}


private void changeSearchViewTextColor(View view) {
    if (view != null) {
        if (view instanceof TextView) {
            ((TextView) view).setTextColor(Color.BLACK);
            return;
        } else if (view instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup) view;
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                changeSearchViewTextColor(viewGroup.getChildAt(i));
            }
        }
    }
}

ツールバーでAPI21を使用し、ツールバーのタイトルのテキストの色を白に設定し、SearchViewのテキストの色を黒に設定してこのコードをテストしましたが、完全に機能します。また、TextViewオブジェクトに直接アクセスしているため、ヒント、ドローアブル、パディング、およびTextViewに関連するすべてのものを変更できます。

26
David_E

これは、ThemeOverlayを使用して純粋にXMLで行うことができます。

<style name="ThemeOverlay.MyApp.ActionBar" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="autoCompleteTextViewStyle">@style/Widget.MyApp.AutoCompleteTextView.SearchView</item>
    <item name="searchViewStyle">@style/Widget.MyApp.SearchView</item>
</style>

<style name="Widget.MyApp.AutoCompleteTextView.SearchView" parent="Widget.AppCompat.AutoCompleteTextView">
    <item name="Android:textColor">#000</item>
    <item name="Android:textColorHint">#5000</item>
</style>

<style name="Widget.MyApp.SearchView" parent="Widget.AppCompat.SearchView">
    <item name="queryBackground">@drawable/search_background</item>
    <item name="searchIcon">@drawable/icon_search</item>
</style>

そして、レイアウトファイルで:

<Android.support.v7.widget.Toolbar
    app:theme="@style/ThemeOverlay.MyApp.ActionBar"
    ... />

ActionBarの代わりにToolBarを使用しているアクティビティにも適用したい場合は、これをActivityのテーマに追加できます。

<style name="Theme.MyApp" parent="Theme.AppCompat">
    <item name="actionBarTheme">@style/ThemeOverlay.MyApp.ActionBar</item>
    ...
</style>
5
Jarett Millard

@David_Eによる解決策は機能しますが、別の方法があります。カスタムレイアウトを定義することもできます。

<style name=”MySearchViewStyle” parent=”Widget.AppCompat.SearchView”>
    <item name="layout">@layout/my_Search_view</item>
</style>

次に、デフォルトのレイアウトファイルを取得できます。これは名前で見つけることができます:abc_search_view.xml、検索ビューで使用され、変更されます。

2
Igor Filippov

Android:textcolorPrimaryをスタイルに変更または追加するだけで、場合によってはすべてのスタイルを変更できます。このアイテムに選択するワットの色は、searchviewテキストの色になります。

1
jenkins ernest