webentwicklung-frage-antwort-db.com.de

Ändern Sie TextColor in SearchView mithilfe der Android-Symbolleiste

Ich habe folgendes Problem. Ich habe meine Actionbar für die Verwendung einer Toolbar eingerichtet, anstatt die API 21 mit appcompat-v7: 21 zu verwenden. Das Tag textColorPrimary style ist so konfiguriert, dass es die Farbe @Android:color/white verwendet, sodass alle Titel in der neuen Android-Symbolleiste eine weiße Textfarbe haben (soweit gut).

Jetzt habe ich eine SearchView hinzugefügt und einen benutzerdefinierten Hintergrund wie folgt eingerichtet:

<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>

Der Zeichencode @drawable/search_background ist ein einfaches weißes Rechteck. Rate mal? Da die Titeltextfarbe in der Symbolleiste weiß ist, ist jetzt auch die Textfarbe in SearchView weiß. Da der SearchView-Hintergrund ein weißes Rechteck ist, kann der Benutzer nicht sehen, was er eingibt.

Meine Frage ist: Wie kann ich unterschiedliche Textfarben für den Android Toolbar-Titel und den SearchView-Text haben?

11
David_E

Nach einigen Nachforschungen habe ich einen sicheren Weg gefunden.

In den SearchView-Stilen habe ich das Layout gefunden, das zum Anzeigen des SearchView verwendet wird. Innerhalb dieses Layouts befindet sich eine TextView (das eigentliche Feld, in das Sie die SearchView eingeben)

<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" />

Beachten Sie das Feld Android:textColor="?android:attr/textColorPrimary". Dies führt zu dem Problem, das ich ursprünglich hatte. Die Textfarbe in SearchView entspricht derjenigen, die für die Titeltextfarbe in der Android-Symbolleiste definiert wurde.

Nun gibt es mehrere Lösungen, die funktionieren könnten hier , aber ich denke, dass die meisten dieser Lösungen das gleiche Problem haben. Sie alle verlassen sich auf die ID des TextView, um auf die Ansicht zuzugreifen und die Textfarbe zu ändern, wie beschrieben hier

Ich persönlich denke, dass das Hardcoding der ID des TextView innerhalb des Codes sehr riskant ist, da wir nicht wissen, ob Google morgen entscheidet, einen anderen ID-Wert für diese Ansicht zu verwenden. In diesem Fall wird unser Code beschädigt.

Aus diesem Grund habe ich eine rekursive Methode erstellt, die das TextView-Objekt in der SearchView abruft und die Farbe nach Belieben ändert.

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

Ich habe diesen Code mit API 21 mit der Symbolleiste getestet, wobei die Textfarbe für den Symbolleistentitel auf Weiß gesetzt und die Textfarbe für SearchView auf Schwarz eingestellt wurde, und es funktioniert einwandfrei. Da wir direkt auf das TextView-Objekt zugreifen, können wir den Hinweis, die Zeichenweise, die Füllungen und alles, was mit der TextView zusammenhängt, ändern.

24
David_E

Dies ist nur in XML mit einer ThemeOverlay möglich:

<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>

Und dann in Ihrer Layoutdatei:

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

Wenn Sie möchten, dass es auch auf Aktivitäten angewendet wird, die eine ActionBar anstelle einer ToolBar verwenden, können Sie dies dem Thema Activity hinzufügen:

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

Lösung von @David_E funktioniert, aber es gibt einen anderen Weg. Sie können auch ein benutzerdefiniertes Layout definieren:

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

Dann können Sie die Standardlayoutdatei verwenden, die Sie anhand des Namens finden können: abc_search_view.xml, der von der Suchansicht verwendet wird, und diese ändern.

2
Igor Filippov

Ändern oder fügen Sie einfach einen Android:textcolorPrimary zu Ihren Stilen hinzu, in einigen Fällen alle Ihre Stile. Welche Farbe Sie für dieses Element wählen, wird die Farbe Ihres searchview-Textes sein.

0
jenkins ernest