Android 在不带ActionBarSherlock的SearchView中更改光标颜色

Android 在不带ActionBarSherlock的SearchView中更改光标颜色,android,searchview,Android,Searchview,我正在尝试更改ICS+中SearchView小部件上闪烁光标的颜色。我尝试了以下方法: 将@null添加到我的 主题 将AutoCompleteTextView的样式添加到我的主题中,并将该样式的textCursorAttribute设置为@null 直接在SearchView上设置android:textCursorDrawable=“@null” 我在这里阅读了答案(),但searchAutoCompleteTextView没有非ABS样式,因此无法尝试此方法。我还寻找了一个Java方法

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

  • @null
    添加到我的 主题
  • 将AutoCompleteTextView的样式添加到我的主题中,并将该样式的textCursorAttribute设置为@null
  • 直接在SearchView上设置android:textCursorDrawable=“@null”
我在这里阅读了答案(),但searchAutoCompleteTextView没有非ABS样式,因此无法尝试此方法。我还寻找了一个Java方法来设置文本游标的可绘制性,但找不到一个-我正在用Java修改SearchView的其他方面,如果有可用的方法,可以使用游标进行修改


我已经对SearchView进行了广泛的定制,但最后一个改动是使它看起来不正确-光标在白色背景上是白色的,因此不容易看到。我还有其他想法可以尝试吗?

根据前面的评论:


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

基于上面的评论和答案,我举了一个例子,说明使用反射时的效果。这解决了我的应用程序中的问题。希望它能为其他人节省一些时间

@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\u 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 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));
    ...

如果深入研究Android源代码,您会发现
mCursorDrawableRes
在3-param构造函数中只设置了一次。不幸的是,这意味着在运行时没有简单的方法来更改它。看起来您的选项可能仅限于使用反射,或将自定义的
SearchView
移动到
android.widget
中,以访问package protected member.MH,感谢你的提示-我可以使用反射在TextView中访问McUrsorDrawables并将其更改为0-这相当于将其设置为@null,颜色显示正确-如果你将此作为答案发布,我将接受。很高兴这一点得到了解决,尽管这个解决方案并不理想,但它并不理想——SearchView是非常不可定制的。我不得不通过使用findViewById和内部ID从SearchView中获取组件来更改其他组件。因此,这在实践中是一个类似的修复方法。对我来说有效的是,我尝试用
final EditText searchTextView=(EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search\u src\u text)替换第5行和第6行在API 16+中工作正常。很好的解决方案,在StackOverflow上从未找到。谢谢,回答很好。在您的评论中,您提到“这将光标资源ID设置为0或@null,这将使其在白色背景上可见”。将其设置为null实际上会使光标颜色默认为与文本颜色相同,因此,如果您已经正确设置了文本颜色,则它将在任何背景上工作。哇,太好了!工作得像个傻瓜charm@EricBrynsvold这是正确的答案。请将此标记为正确。不适用于带KitKat的S5和S4。没有在其他设备上测试过。什么是“动作模式关闭”?可以改为设置颜色吗?action_mode_close只是一个png。通常☑ 白色。您也可以使用白色代替白色。您可以演示如何为新材料设计支持库执行此操作吗?我认为唯一的方法是设置一个真正的drawable来替换插入符号,或者使用colorControlActivated(但这也改变了其他事情)。