android - 使用材料设计为 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 是否存在问题?
解决方案
推荐阅读
- angular - 即使按钮在表单内,表单提交也无法处理角度
- huawei-mobile-services - 如何获取设备支持的 DRM 安全级别?
- c++ - 当包含头文件的文件不在根项目文件夹中时,如何包含头文件?
- javascript - 从nodeJs服务器获得响应后如何调用函数(使用javascript)?
- python - AttributeError:“NoneType”对象没有名为“find_all”的属性
- r - 根据 R 中的某些条件将缺失的日期添加到数据表中
- python - Python:动态分箱熊猫中的列
- java - 如何在启动 android 应用程序时启动特定片段
- python - 正则表达式 - 仅选择字符串中的单独单词
- python - 如何将具有混合 unicode 表示和 unicode 的文本文件转换为字节?