使用材料设计将 androidx.appcompat.widget.SearchView操作栏中的搜索图标更改为 androidx.legacy:legacy-support-v4:1.0.0

问题描述

我被这个问题困了好几天..我决定添加一个底部导航,这迫使我将我的设计更改为材料设计。 (https://material.io/components/bottom-navigation/android)。我的操作栏现在有几个样式更改。更准确地说,是它的 androidx.appcompat.widget.SearchView。如下图所示,搜索图标是黑色的,我需要它是白色的。

Action Bar with uncoloured search icon

对于这里回答的类似问题,我已经尝试了很多解决方案,但似乎没有一个解决问题。我目前的情况如下:

我有这个菜单

kwarg

那些是我的styles.xml 的相关部分:

<?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"/>

这是片段,它在我的应用程序的几个部分中被重用,它创建了菜单包括 onCreateOptionsMenu,其中一些其他有希望的 SO 答案尝试似乎完成了工作,但对我不起作用>

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

这些是我的 gradle 文件中使用的一些依赖项

...
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);

    }

}

如何让搜索图标再次变白?

我应该删除 legacy.support 库吗?对应的依赖是否太多?扩展 DialogFragment 是否存在问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)