Изменение цвета курсора в SearchView без ActionBarSherlock

Я пытаюсь изменить цвет мигающего курсора виджета SearchView в ICS+. Я попробовал следующее:

  • добавлять <item name="android:textCursorDrawable">@null</item> к моему тема
  • добавление стиля для AutoCompleteTextViews в мою тему и установка textCursorAttribute этого стиля в @null
  • задание android:textCursorDrawable="@null" непосредственно в SearchView

Я читаю ответ здесь (пользовательский цвет курсора в SearchView), но нет non-ABS стиль для searchAutoCompleteTextView, поэтому не мог попробовать это. Я также искал метод Java для установки текстового курсора drawable, но не смог его найти - я изменяю другие аспекты SearchView в Java и смог бы сделать это с помощью курсора, если бы был доступен метод.

Я настроил SearchView довольно широко, но это последнее изменение не позволяет ему смотреть вправо - курсор белый на белом фоне, поэтому его нелегко увидеть. Любой другие идеи вещей, которые я могу попробовать?

4 ответов


на основе комментариев и ответов выше я привел пример как это может выглядеть с помощью отражения. Это решает проблему в моем приложении. Надеюсь, это сэкономит кому-то время.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.entity_list_actions, menu);
    final SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
    final int textViewID = searchView.getContext().getResources().getIdentifier("android:id/search_src_text",null, null);
    final AutoCompleteTextView searchTextView = (AutoCompleteTextView) searchView.findViewById(textViewID);
    try {
        Field mCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
        mCursorDrawableRes.setAccessible(true);
        mCursorDrawableRes.set(searchTextView, 0); //This sets the cursor resource ID to 0 or @null which will make it visible on white background
    } catch (Exception e) {}
    return super.onCreateOptionsMenu(menu);
}

что 0 может быть любым другим идентификатором ресурса, таким как R. drawable.my_cursor


<style name="CustomTheme" parent="android:Theme.Holo.Light">
    ...
    <item name="android:autoCompleteTextViewStyle">@style/SearchViewStyle</item>
    ...
</style>

<style name="SearchViewStyle" parent="@android:style/Widget.Holo.Light.AutoCompleteTextView">
    <item name="android:textCursorDrawable">@drawable/action_mode_close</item>
</style>

согласно предыдущему комментарию:

Если вы копаетесь в исходном коде Android, вы найдете это mCursorDrawableRes устанавливается только один раз в конструкторе 3-param. К сожалению, это означает, что нет простого способа изменить его во время выполнения. Похоже, ваши варианты могут быть ограничены использованием отражения или перемещением пользовательского SearchView на android.widget пакет для доступа к защищенному члену пакета.


это изменяет цвет текста и работает также на Android 8:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu_search, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        SearchView.SearchAutoComplete theTextArea = (SearchView.SearchAutoComplete) searchView
                .findViewById(R.id.search_src_text);
        theTextArea.setTextColor(getResources().getColor(R.color.yourColor));
    ...