在没有ActionBarSherlock的情况下更改SearchView中的光标颜色

时间:2013-09-09 19:07:37

标签: android searchview

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

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

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

我已经非常广泛地定制了SearchView,但是最后一次更改是让它看起来不正确 - 光标在白色背景上是白色的,所以它不容易看到。我可以尝试其他任何想法吗?

4 个答案:

答案 0 :(得分:55)

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

@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

答案 1 :(得分: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>

答案 2 :(得分:1)

根据之前的评论:

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

答案 3 :(得分: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));
    ...