2014-11-26 5 views
9

У меня есть следующая проблема. Я установил свой Actionbar для использования панели инструментов вместо использования API 21 с помощью appcompat-v7: 21. Тег стиля textColorPrimary настроен на использование цвета @android:color/white, поэтому все заголовки на новой панели инструментов Android будут иметь белый цвет текста (насколько это хорошо).Изменение TextColor в SearchView с помощью панели инструментов Android

Теперь I've добавил 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?

ответ

24

После некоторых исследований я нашел безопасный способ сделать это.

Копаясь в стилях 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.

Теперь есть несколько решений, которые могут работать here, но я думаю, что большинство этих решений имеют одинаковую проблему. Все они полагаются на идентификатор TextView, чтобы получить доступ к виду и изменить цвет текста, как описано here

Лично я считаю, что hardcoding идентификатор TextView внутри кода очень рискован, потому что мы не знайте, если завтра Google решит использовать другое значение id для этого представления, в этом случае наш код будет сломан.

По этой причине я создал рекурсивный метод, который получает объект TextView в SearchView и меняет цвет на все, что мы хотим.

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

Я тестировал этот код с помощью API 21 с панелью инструментов, имеющей цвет текста Панель заголовка установлен на белый, и настройка цвета текста SearchView к черному, и это работает прекрасно. Кроме того, когда мы напрямую обращаемся к объекту TextView, мы можем изменить подсказки, чертежи, paddings и все, что связано с TextView.

+0

очень отличный алгоритм i love it ... – massaimara98

+2

если вы используете панель инструментов, добавьте это в свою панель инструментов. @ android: color/white. что он – Max

+0

Работает как charm :) – Wizard

2

Решение от @David_E работает, но есть и другой способ. Можно также определить пользовательский макет:

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

Затем вы можете взять файл схемы по умолчанию, которые вы можете найти по имени: abc_search_view.xml, используемый зрения поиска и изменить его.

+0

Что такое контент abc_search_view.xml –

2

Это можно сделать исключительно в XML с использованием ThemeOverlay:

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

не работал на меня –

-2

Вам необходимо установить атрибут editTextColor в стиле, чтобы изменить его с помощью XML.

<style name="SearchViewStyle" parent="Widget.AppCompat.SearchView"> 
    <item name="android:editTextColor">@color/some_color</item> 
</style> 

и применить этот стиль к SearchView в макете.

<android.support.v7.widget.Toolbar> 

    <android.support.v7.widget.SearchView 
     android:theme="@style/SearchViewStyle" /> 

</android.support.v7.widget.Toolbar> 
0

Просто изменить или добавить android:textcolorPrimary ваши стили, все стили в некоторых случаях. Ват всегда цвет, который вы выберете для этого элемента, будет цветом вашего текста searchview.

Смежные вопросы