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

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

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

我在这里阅读答案( SearchView中的自定义光标颜色 ),但searchAutoCompleteTextView没有非ABS样式,所以无法尝试此操作。 我还寻找了一个Java方法来设置文本光标drawable,但找不到一个 – 我正在修改Java中的SearchView的其他方面,并将能够与光标,如果有一种方法可用。

我已经非常广泛地对SearchView进行了自定义,但是最后一项变化是使它看起来不错 – 光标在白色背景上是白色的,所以不容易看到。 任何其他想法我可以尝试?

Solutions Collecting From Web of "在没有ActionBarSherlock的情况下更改SearchView中的光标颜色"

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

 @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

 <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源代码,您会发现mCursorDrawableRes只在3-param构造函数中设置一次。 不幸的是,这意味着在运行时没有简单的方法来改变它。 看起来像你的select可能会限制使用reflection,或移动您的自定义SearchViewandroid.widget包为了访问包保护成员。

这改变了文字的颜色,也适用于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)); ...