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.
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?
