Search code examples
androidsearchview

Changing the cursor color in SearchView without ActionBarSherlock


I am attempting to change the color of the blinking cursor on the SearchView widget in ICS+. I have tried the following:

  • Adding <item name="android:textCursorDrawable">@null</item> to my theme
  • Adding a style for AutoCompleteTextViews to my theme and setting the textCursorAttribute of that style to @null
  • Setting android:textCursorDrawable="@null" directly on the SearchView

I read the answer here (Custom cursor color in SearchView), but there is not a non-ABS style for searchAutoCompleteTextView, so could not try this. I also looked for a Java method to set the text cursor drawable, but could not find one - I am modifying other aspects of the SearchView in Java and would be able to do so with the cursor if there were a method available.

I have customized the SearchView pretty extensively, but this one last change is keeping it from looking right - the cursor is white on a white background, so it is not easily visible. Any other ideas of things I can try?


Solution

  • Based on the comments and answers above I made an example of how this could look using reflection. This solves the problem in my app. Hope it saves someone else some time.

    @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);
    }
    

    That 0 could be any other resource ID like R.drawable.my_cursor