Changing the cursor color in SearchView without ActionBarSherlock

前端 未结 4 1824
予麋鹿
予麋鹿 2020-12-01 22:12

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

  • Adding
相关标签:
4条回答
  • 2020-12-01 22:38
    <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>
    
    0 讨论(0)
  • 2020-12-01 22:40

    This changes the text color and works also on 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));
        ...
    
    0 讨论(0)
  • 2020-12-01 22:41

    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

    0 讨论(0)
  • 2020-12-01 22:53

    As per earlier comment:

    If you dig into the Android source code, you'll find that mCursorDrawableRes only gets set once in the 3-param constructor. Unfortunately that means there is no easy way to change it at runtime. Looks like your options may be limited to using reflection, or moving your custom SearchView into the android.widget package in order to access the package protected member.

    0 讨论(0)
提交回复
热议问题