change androidx.appcompat.widget.SearchView (Search Icon within Action Bar) for androidx.legacy:legacy-support-v4:1.0.0 using material design

Viewed 418

I am stuck on this for days.. I decided to add a bottom navigation, which forced me to change my design to material design. (https://material.io/components/bottom-navigation/android). Several style changes are now messing with my Action Bar. To be more precise, the androidx.appcompat.widget.SearchView of it. As seen in the picture below the search icon is black, I need it to be white.

Action Bar with uncoloured search icon

I have tried a lot of solutions for similar problems answered here, but none seemed to do the trick. My current situation is the following:

I have this menu:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      android:theme="@style/MyActionBarTheme"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- "toolbar top right hand items"-->

    <item
        android:id="@+id/activityExecutionsMenu_search"
        android:icon="@drawable/ic_search_white"
        android:title="@string/activityExecutionsFragments_menu_search_hint"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="always" />

    <item
        android:id="@+id/activityExecutionsMenu_group"
        android:icon="@drawable/ic_group"
        android:title="@string/activityExecutionsFragments_menu_group"
        app:showAsAction="always"/>

    <item
        android:id="@+id/activityExecutionsMenu_filter"
        android:icon="@drawable/ic_filter"
        android:title="@string/activityExecutionsFragments_menu_filter"
        app:showAsAction="always"/>

    <item
        android:id="@+id/activityExecutionsMenu_sort"
        android:icon="@drawable/ic_sort"
        android:title="@string/activityExecutionsFragments_menu_filter"
        app:showAsAction="always"/>

those are the relevant parts of my styles.xml:

<style name="MyActionBarTheme" parent="ThemeOverlay.MaterialComponents.Dark">
    <!-- Customize your theme here. -->
    <item name="android:actionBarWidgetTheme">@style/MyPopupMenuTheme_withRoundCorners_blue</item>
    <item name="actionOverflowMenuStyle">@style/MyPopupMenuTheme_withRoundCorners_blue</item>
    <item name="android:textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge
    </item>
    <item name="android:textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall
    </item>
    <item name="actionMenuTextColor">@color/white</item>
    <!--<item name="colorControlNormal">@color/stress10</item>-->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <!--<item name="android:textColorSecondary">@color/mood6</item>-->
    <item name="android:windowBackground">@color/backgroundColor</item>
    <item name="popupMenuStyle">@style/MyPopupMenuTheme_withRoundCorners_blue</item>
    <item name="android:popupMenuStyle">@style/MyPopupMenuTheme_withRoundCorners_blue</item>
    <!--<item name="android:actionBarStyle">@style/MyTheme.ActionBarStyle</item>-->
    <item name="android:actionButtonStyle">@style/myActionButtonStyle</item>
    <item name="actionButtonStyle">@style/myActionButtonStyle</item>
</style>

<style name="myActionButtonStyle" parent="Widget.MaterialComponents.FloatingActionButton">
    <item name="android:minWidth">30dp</item>
    <item name="android:maxWidth">48dp</item>
    <item name="android:width">36dp</item>
</style>



<style name="myPopupMenuTextAppearanceSmall" parent="@style/MaterialAlertDialog.MaterialComponents.Title.Text">
    <item name="android:textColor">@color/colourAsLinkIndicatingAction</item>
</style>

<style name="myPopupMenuTextAppearanceLarge" parent="@style/MaterialAlertDialog.MaterialComponents.Title.Text">
    <item name="android:textColor">@color/colourAsLinkIndicatingAction</item>
</style>

<style name="MyPopupMenuTheme_withRoundCorners" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge
    </item>
    <item name="android:textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall
    </item>
    <item name="android:tint">@color/colourAsLinkIndicatingAction</item>
    <item name="android:textColor">@color/colourAsLinkIndicatingAction</item>
    <item name="android:popupMenuStyle">@drawable/rounded_corners_background_for_popupmenu</item>
    <item name="android:popupBackground">@drawable/rounded_corners_background_for_popupmenu</item>
    <item name="popupMenuStyle">@drawable/rounded_corners_background_for_popupmenu</item>
    <item name="background">@drawable/rounded_corners_background_for_popupmenu</item>
    <item name="android:colorBackground">@color/colourAsLinkIndicatingAction</item>
</style>

<style name="MyPopupMenuTheme_withRoundCorners_blue" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:textAppearanceLargePopupMenu">@style/myPopupMenuTextAppearanceLarge
    </item>
    <item name="android:textAppearanceSmallPopupMenu">@style/myPopupMenuTextAppearanceSmall
    </item>
    <item name="android:textColor">@color/colourAsLinkIndicatingAction</item>
    <item name="android:popupMenuStyle">@drawable/rounded_corners_background_for_popupmenu_blue</item>
    <item name="android:popupBackground">@drawable/rounded_corners_background_for_popupmenu_blue</item>
    <item name="popupMenuStyle">@drawable/rounded_corners_background_for_popupmenu_blue</item>
    <item name="background">@drawable/rounded_corners_background_for_popupmenu_blue</item>
    <item name="android:colorBackground">@color/colourAsLinkIndicatingAction</item>
</style>

This is the Fragment, that gets reused in several parts of my app which creates the menu, including the onCreateOptionsMenu, in which some other promising attempts of SO answers seemed to get the job done, but do not work for me

...
import android.app.SearchManager;
...
import import androidx.appcompat.widget.SearchView;
...

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

...    


public class ActivityExecutions_Fragment
        extends DialogFragment
{
    public View view;
    private Toolbar myToolbar;
    public SearchView searchView;
   ...

    /*
     * empty constructor
     */
    public ActivityExecutions_Fragment(){}

    /*
     * use this to instantiate fragment
     *
     * pass parameters to individualize behaviour
     */
    public static ActivityExecutions_Fragment newInstance(String source)
    {
        ActivityExecutions_Fragment frag = new ActivityExecutions_Fragment();
        Bundle args = new Bundle();
        args.putString("source", source);
        frag.setArguments(args);
        return frag;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {


        FrameLayout frameLayout = new FrameLayout(getActivity());

        ...


        populateViewForOrientation(inflater, frameLayout);
        return frameLayout;
    }



    /*
     * remove title bar
     */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        // request a window without the title
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }



    /**
     similar behaviour as onCreate() in activities
     adjusted for fragments
     */
    private void populateViewForOrientation(LayoutInflater inflater, ViewGroup viewGroup)
    {
        viewGroup.removeAllViewsInLayout();

        if(deviceIsCurrentlyInPortraitOrientation)
        {
            view = inflater.inflate(R.layout.activity_executions_fragment, viewGroup);
        }
        else
        {
            view = inflater.inflate(R.layout.activity_executions_fragment, viewGroup);
        }

        ...

        myToolbar = (Toolbar) view.findViewById(R.id.toolbar_activityExecutions);

        
        getActivity().getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white);
        getActivity().getSupportActionBar().setHomeButtonEnabled(true);
        getActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getActivity().getSupportActionBar().setDisplayShowHomeEnabled(true);

    }


    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();

        inflater.inflate(R.menu.activity_executions_menu, menu);
        super.onCreateOptionsMenu(menu,inflater);

        searchView = (SearchView)menu.findItem(R.id.activityExecutionsMenu_search).getActionView();
        searchView.setMaxWidth(Integer.MAX_VALUE);

// this attempt does not work icon stays black
        ImageView searchIcon=
                searchView.findViewById(androidx.appcompat.R.id.search_mag_icon);
        searchIcon.setColorFilter(getResources().getColor(R.color.white),
                android.graphics.PorterDuff.Mode.SRC_IN);


        );
    }

    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        menu.findItem(R.id.activityExecutionsMenu_group).setIcon(R.drawable.ic_ungroup);

        toolbar_searchButton = menu.findItem(R.id.activityExecutionsMenu_search);
        toolbar_groupButton = menu.findItem(R.id.activityExecutionsMenu_group);
        toolbar_filterButton = menu.findItem(R.id.activityExecutionsMenu_filter);
        toolbar_sortButton = menu.findItem(R.id.activityExecutionsMenu_sort);

    }

}

And these are some dependencies used in my gradle file

implementation "androidx.work:work-runtime:2.5.0"
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.12'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'com.google.firebase:firebase-appindexing:19.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.googlecode.mp4parser:isoparser:1.1.21'
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
implementation 'androidx.palette:palette:1.0.0'

How do I manage to get the search icon to be white again?

Should I remove the legacy.support library? Are there too many corresponding dependencies? Is it an issue extending DialogFragment?

0 Answers
Related