Android SearchView — изменить цвет курсора

#java #android #search #themes

#java #Android #Поиск #темы

Вопрос:

Я пытаюсь изменить цвет курсора моего SearchView, который я создаю и добавляю в свою панель действий следующим образом:

 MenuItem findItem = menu.findItem(R.id.menu_action_search);
        searchView = (SearchView) findItem.getActionView();
  

XML-код:

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

      <item android:id="@ id/menu_action_search"
          android:title="Search"
          android:icon="@drawable/ic_search_white"
          app:showAsAction="collapseActionView|always"
          app:actionViewClass="android.support.v7.widget.SearchView" />

</menu>
  

И в моей деятельности есть панель инструментов, подобная этой:

 <android.support.design.widget.AppBarLayout
    android:id="@ id/appbarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    >

        <android.support.v7.widget.Toolbar
            android:id="@ id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"

            style="@style/EActionBar"

            />
</android.support.design.widget.AppBarLayout>
  

Есть ли способ переопределить существующий стиль и изменить цвет курсора в режиме автозаполнения текста?

Ответ №1:

Вы можете выполнить следующие шаги, чтобы изменить цвет курсора.

Шаг 1: Определите свой собственный курсор для рисования, который будет помещен в res/drawable папку.

my_cursor.xml

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="#0f0"/>
    <size android:width="1dp"/>
</shape>
  

Шаг 2: Добавьте этот код в onCreateOptionsMenu .

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);

    MenuItem findItem = menu.findItem(R.id.menu_action_search);
    searchView = (SearchView) findItem.getActionView();

    // Add this code
    SearchView.SearchAutoComplete searchTextView = searchView.findViewById(R.id.search_src_text);
    try {
        Field field = TextView.class.getDeclaredField("mCursorDrawableRes");
        field.setAccessible(true);
        field.set(searchTextView, R.drawable.my_cursor);
    } catch (Exception e) {
        // Ignore exception
    }

    // Your logic code here

    return super.onCreateOptionsMenu(menu);
}
  

Комментарии:

1. Этот метод работает, но вот так: окончательный Android.support.v7.widget. SearchView.searchchautocomplete searchchautocomplete = (SearchView.searchchautocomplete) SearchView.findViewById (android.support.v7.appcompat.R.id.search_src_text); … field.set(searchAutoComplete, R.выводимый. white_cursor); Поэтому поле необходимо из текстового поля searchview, а не из самого searchview

2. @AndreiF Пожалуйста, внимательно посмотрите на мой ответ, я уже установил текстовое поле для просмотра поиска.

3. Да, извините. Я только проснулся, когда тестировал код, даже не выпил свой кофе. Спасибо!

4. Не беспокойтесь. Удачного кодирования 🙂

5. SearchView.findViewById(androidx.appcompat.R.id.search_src_text) — для androidx

Ответ №2:

Начиная с Android Q и выше, вы можете легко сделать это в коде. Сначала найдите свой SearchView:

 SearchView search = findViewById(R.id.search);
  

Затем найдите поле searchText с помощью вашего SearchView:

 EditText searchText = search.findViewById(androidx.appcompat.R.id.search_src_text);
  

Затем используйте это, чтобы изменить цвет курсора:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    searchText.setTextCursorDrawable(R.drawable.cursor_primary);
}
  

Вам также необходимо создать режим рисования для каждого цвета, который вы хотите использовать. В моем случае выше это cursor_primary.xml:

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/colorPrimary"/>
    <size android:width="1dp"/>
</shape>
  

Вот и все!

Обновление от 8 июля 2022

Позже я обнаружил, что drawable не обновляется должным образом до перезапуска приложения. Итак, вместо использования отрисовываемых объектов используйте это:

 searchText.getTextCursorDrawable().setTint(ContextCompat.getColor(context, R.color.colorPrimary));
  

.. и это работает так, как должно!