8

我正在尝试更改 ICS+ 中 SearchView 小部件上闪烁光标的颜色。我尝试了以下方法:

  • 添加<item name="android:textCursorDrawable">@null</item>到我的主题
  • 将 AutoCompleteTextViews 的样式添加到我的主题并将该样式的 textCursorAttribute 设置为 @null
  • android:textCursorDrawable="@null"直接在 SearchView 上设置

我在这里阅读了答案(SearchView 中的自定义光标颜色),但是 searchAutoCompleteTextView 没有非 ABS 样式,因此无法尝试。我还寻找了一种 Java 方法来设置文本光标可绘制,但找不到 - 我正在修改 Java 中 SearchView 的其他方面,如果有可用的方法,我可以使用光标来做到这一点。

我已经对 SearchView 进行了相当广泛的自定义,但最后一个更改是让它看起来不正确——光标在白色背景上是白色的,所以不容易看到。我可以尝试任何其他想法吗?

4

4 回答 4

57

根据上面的评论和答案,我举了一个例子来说明如何使用反射。这解决了我的应用程序中的问题。希望它可以节省其他人一些时间。

@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 可以是任何其他资源 ID,例如 R.drawable.my_cursor

于 2013-11-05T18:45:22.040 回答
3
<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>
于 2013-12-24T09:35:01.060 回答
1

根据之前的评论:

如果您深入研究 Android 源代码,您会发现mCursorDrawableRes在 3-param 构造函数中只设置了一次。不幸的是,这意味着没有简单的方法可以在运行时更改它。看起来您的选择可能仅限于使用反射,或者将您的自定义移动SearchViewandroid.widget包中以访问包保护成员。

于 2013-09-09T20:25:27.597 回答
1

这会改变文本颜色并且也适用于 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));
    ...
于 2014-01-05T12:46:48.427 回答