【问题标题】:Changing the cursor color in SearchView without ActionBarSherlock在没有 ActionBarSherlock 的情况下更改 SearchView 中的光标颜色
【发布时间】:2013-09-09 19:07:37
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您深入研究 Android 源代码,您会发现 mCursorDrawableRes 在 3-param 构造函数中只设置一次。不幸的是,这意味着没有简单的方法可以在运行时更改它。看起来您的选择可能仅限于使用反射,或将您的自定义 SearchView 移动到 android.widget 以访问包受保护的成员。
  • MH,感谢您的提示-我能够使用反射来获取 TextView 中的 mCursorDrawableRes 并将其更改为 0-这相当于将其设置为 @null 并且颜色正确显示-如果您将此作为答案发布,我会接受。
  • 很高兴,尽管解决方案并不理想。
  • 同意这并不理想 - SearchView 开箱即用是非常不可定制的。我必须通过使用 findViewById 和内部 ID 来更改其他组件,以从 SearchView 中获取组件。所以这在实践中是一个类似的修复。

标签: android searchview


【解决方案1】:

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

@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

【讨论】:

  • 对我有用的是当我尝试将第 5 行和第 6 行替换为 final EditText searchTextView = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
  • 在 API 16+ 中工作正常。很好的解决方案,在 stackoverflow 上从未找到
  • 谢谢,很好的回答。关于您的评论的一个注释,您说“这会将光标资源 ID 设置为 0 或 @null,这将使其在白色背景上可见”。将其设置为 null 实际上会使光标颜色默认与文本颜色相同,因此如果您已经正确设置了文本颜色,它将适用于任何背景。
  • 太好了!像魅力一样工作
  • @EricBrynsvold 这是正确的答案。请将此标记为正确。
【解决方案2】:
<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>

【讨论】:

  • 什么是“action_mode_close”?是否可以改为设置颜色?
  • action_mode_close 只是一个 png。通常是 ☑ 白色。你也可以用白色代替
  • 您能说明如何为新的材料设计支持库做这件事吗?我认为这样做的唯一方法是设置一个真正的drawable来替换插入符号,或者使用colorControlActivated(但这也会改变其他东西)。
【解决方案3】:

根据之前的评论:

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

【讨论】:

    【解决方案4】:

    这会改变文本颜色并且也适用于 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));
        ...
    

    【讨论】:

    • 不适用于带有 KitKat 的 S5 和 S4。没有在其他设备上测试过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多