首页 > 解决方案 > 使用材料设计为 androidx.legacy:legacy-support-v4:1.0.0 更改 androidx.appcompat.widget.SearchView(操作栏中的搜索图标)

问题描述

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

带有无色搜索图标的操作栏

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

我有这个菜单:

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

这些是我的 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>

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

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

    }

}

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

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'

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

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

标签: androidandroid-actionbarmaterial-design

解决方案


推荐阅读