App Compat支持库包中包含可以包含在应用程序中的几个库。这些库中的每一个都支持特定范围的Android平台版本和一组功能。
有关 gradle 构建和 appcompat 的错误出现在 flutter 中
任务“:app:mergeExtDexDebug”执行失败。 无法解析配置“:app:debugRuntimeClasspath”的所有文件。 raryelements=aar, org.gradle.status=release, org.gradle.usage=java-ru...
Android 12 忽略 showSoftInput,因为未提供 VIEW 服务
我的应用程序在很多设备上运行良好。但自从在我自己的 Pixel 上升级到 Android 12 后,调用 showSoftInput 或点击 Bottomshee 中的 AppCompatEditText 时会发生以下情况...
使用 android_alarm_manager_plus 构建 Flutter 项目时出现奇怪错误
我创建了一个空的 Flutter 项目,将 android_alarm_manager_plus 添加到 pubspec.yaml 中,但是当我尝试构建应用程序时,收到此错误: 注意:C:\Users\ALEX\AppData\Local\Pub\Cache\hosted\pub.dev\
Rtl 对AppCompatEditText Android 的drawableEnd 的支持
我像这样使用这个AppCompatEditText 我正在像这样使用这个AppCompatEditText <com.google.android.material.textfield.TextInputLayout android:id="@+id/tilCountry" style="@style/LoginTextInputLayoutStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/dpSixteen" android:layout_marginEnd="@dimen/dpSixteen" android:layout_marginBottom="@dimen/dpTwenty" android:background="@null" android:hint="@string/chooseCountry" app:hintTextAppearance="@style/TextAppearance.App.TextInputLayout" app:hintTextColor="@color/moonRaker"> <androidx.appcompat.widget.AppCompatEditText android:id="@+id/etCountry" android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableEnd="@drawable/ic_blue_right" android:drawableTint="@color/blue" android:focusable="true" android:imeOptions="actionNext" android:textAppearance="@style/SignupEditText" tools:targetApi="m" /> </com.google.android.material.textfield.TextInputLayout> 当用户将语言更改为阿拉伯语时,rtl 看起来一切都很好,但是 drawableEnd 不从右到左改变。 选择带有镜像效果的阿拉伯语时,箭头必须切换到左侧。 我的可绘制代码 <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="7.41dp" android:height="12dp" android:viewportWidth="7.41" android:viewportHeight="12" **android:autoMirrored="true"**> <path android:pathData="M0,10.58 L4.58,6 0,1.41 1.41,0l6,6 -6,6Z" android:fillColor="#1b47db"/> </vector> 这里出了什么问题? 如果语言是阿拉伯语,则Drawable应从头开始设置,否则应从末尾开始设置。 etCountry.setCompoundDrawablesWithIntrinsicBounds(0, 0, @drawable/ic_blue_right, 0); //Right side drawable etCountry.setCompoundDrawablesWithIntrinsicBounds(@drawable/ic_blue_right, 0, 0, 0); //Left side drawable 试试这个方法
由于空指针异常,任务“:app:mergeExtDexDebug”执行失败
我正在制作一个在android studio中显示PDF的应用程序,它加载文件,然后通过外部库显示它们我还没有完全实现显示功能,主要是由于...
AppCompat 现在是否需要 minSdKVersion >= 21?
我的应用程序的 minSdkVersion 为 19 并使用 AppCompat。这在 AppCompat 版本 1.6.1 中运行良好,但在 1.7.0 中,该应用程序无法构建(在 Android Studio 中): 清单合并失败:使用-...
当我将 AppCompat 库中的可绘制对象用于工具栏菜单项时,着色会按预期工作。像这样: 当我将 AppCompat 库中的可绘制对象用于我的 Toolbar 菜单项时,着色会按预期工作。像这样: <item android:id="@+id/action_clear" android:icon="@drawable/abc_ic_clear_mtrl_alpha" <-- from AppCompat android:title="@string/clear" /> 但是,如果我使用自己的可绘制对象,或者实际上将可绘制对象从 AppCompat 库复制到我自己的项目中,它根本不会着色。 <item android:id="@+id/action_clear" android:icon="@drawable/abc_ic_clear_mtrl_alpha_copy" <-- copy from AppCompat android:title="@string/clear" /> AppCompatToolbar中是否有一些特殊的魔法只能为该库中的可绘制对象着色?有什么方法可以让它与我自己的绘图一起使用吗? 使用 compileSdkVersion = 21 和 targetSdkVersion = 21 在 API 级别 19 设备上运行此程序,并使用 AppCompat 中的所有内容 abc_ic_clear_mtrl_alpha_copy 是 abc_ic_clear_mtrl_alpha 中的 AppCompat png 的精确副本 编辑: 着色基于我在主题中为 android:textColorPrimary 设置的值。 例如<item name="android:textColorPrimary">#00FF00</item>会给我一种绿色色调。 截图 使用 AppCompat 的可绘制对象按预期进行着色 着色不适用于从 AppCompat 复制的可绘制对象 在新的支持库v22.1之后,您可以使用类似这样的东西: @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_home, menu); Drawable drawable = menu.findItem(R.id.action_clear).getIcon(); drawable = DrawableCompat.wrap(drawable); DrawableCompat.setTint(drawable, ContextCompat.getColor(this,R.color.textColorPrimary)); menu.findItem(R.id.action_clear).setIcon(drawable); return true; } app:iconTint 属性在支持库中的 SupportMenuInflater 中实现(至少在 28.0.0 中)。 已使用 API 15 及更高版本成功测试。 菜单资源文件: <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_settings" android:icon="@drawable/ic_settings_white_24dp" app:iconTint="?attr/appIconColorEnabled" <!-- using app name space instead of android --> android:menuCategory="system" android:orderInCategory="1" android:title="@string/menu_settings" app:showAsAction="never" /> <item android:id="@+id/menu_themes" android:icon="@drawable/ic_palette_white_24dp" app:iconTint="?attr/appIconColorEnabled" android:menuCategory="system" android:orderInCategory="2" android:title="@string/menu_themes" app:showAsAction="never" /> <item android:id="@+id/action_help" android:icon="@drawable/ic_help_white_24dp" app:iconTint="?attr/appIconColorEnabled" android:menuCategory="system" android:orderInCategory="3" android:title="@string/menu_help" app:showAsAction="never" /> </menu> (在本例中,?attr/appIconColorEnabled是应用程序主题中的自定义颜色属性,图标资源是矢量绘图。) 在 ColorFilter 上设置 MenuItem(色调)很简单。这是一个例子: Drawable drawable = menuItem.getIcon(); if (drawable != null) { // If we don't mutate the drawable, then all drawable's with this id will have a color // filter applied to it. drawable.mutate(); drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); drawable.setAlpha(alpha); } 如果您想支持不同的主题并且不想仅仅为了颜色或透明度而有额外的副本,上面的代码非常有帮助。 单击此处获取帮助程序类,以在菜单中的所有可绘制对象上设置ColorFilter,包括溢出图标。 在 onCreateOptionsMenu(Menu menu) 中,只需在扩充菜单后致电 MenuColorizer.colorMenu(this, menu, color); 即可;瞧;你的图标有颜色。 因为如果你看一下AppCompat中TintManager的源代码,你会看到: /** * Drawables which should be tinted with the value of {@code R.attr.colorControlNormal}, * using the default mode. */ private static final int[] TINT_COLOR_CONTROL_NORMAL = { R.drawable.abc_ic_ab_back_mtrl_am_alpha, R.drawable.abc_ic_go_search_api_mtrl_alpha, R.drawable.abc_ic_search_api_mtrl_alpha, R.drawable.abc_ic_commit_search_api_mtrl_alpha, R.drawable.abc_ic_clear_mtrl_alpha, R.drawable.abc_ic_menu_share_mtrl_alpha, R.drawable.abc_ic_menu_copy_mtrl_am_alpha, R.drawable.abc_ic_menu_cut_mtrl_alpha, R.drawable.abc_ic_menu_selectall_mtrl_alpha, R.drawable.abc_ic_menu_paste_mtrl_am_alpha, R.drawable.abc_ic_menu_moreoverflow_mtrl_alpha, R.drawable.abc_ic_voice_search_api_mtrl_alpha, R.drawable.abc_textfield_search_default_mtrl_alpha, R.drawable.abc_textfield_default_mtrl_alpha }; /** * Drawables which should be tinted with the value of {@code R.attr.colorControlActivated}, * using the default mode. */ private static final int[] TINT_COLOR_CONTROL_ACTIVATED = { R.drawable.abc_textfield_activated_mtrl_alpha, R.drawable.abc_textfield_search_activated_mtrl_alpha, R.drawable.abc_cab_background_top_mtrl_alpha }; /** * Drawables which should be tinted with the value of {@code android.R.attr.colorBackground}, * using the {@link android.graphics.PorterDuff.Mode#MULTIPLY} mode. */ private static final int[] TINT_COLOR_BACKGROUND_MULTIPLY = { R.drawable.abc_popup_background_mtrl_mult, R.drawable.abc_cab_background_internal_bg, R.drawable.abc_menu_hardkey_panel_mtrl_mult }; /** * Drawables which should be tinted using a state list containing values of * {@code R.attr.colorControlNormal} and {@code R.attr.colorControlActivated} */ private static final int[] TINT_COLOR_CONTROL_STATE_LIST = { R.drawable.abc_edit_text_material, R.drawable.abc_tab_indicator_material, R.drawable.abc_textfield_search_material, R.drawable.abc_spinner_mtrl_am_alpha, R.drawable.abc_btn_check_material, R.drawable.abc_btn_radio_material }; /** * Drawables which contain other drawables which should be tinted. The child drawable IDs * should be defined in one of the arrays above. */ private static final int[] CONTAINERS_WITH_TINT_CHILDREN = { R.drawable.abc_cab_background_top_material }; 这几乎意味着他们将特定的资源ID列入白名单以进行着色。 但我想你总能看到他们如何对这些图像进行着色并做同样的事情。就像在可绘制对象上设置 ColorFilter 一样简单。 我个人更喜欢这个方法link 使用以下内容创建 XML 布局: <?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/ic_action_something" android:tint="@color/color_action_icons_tint"/> 并从菜单中引用此绘图: <item android:id="@+id/option_menu_item_something" android:icon="@drawable/ic_action_something_tined" 本线程中的大多数解决方案要么使用更新的 API,要么使用反射,或者使用密集视图查找来获取膨胀的 MenuItem。 但是,有一种更优雅的方法可以做到这一点。您需要一个自定义工具栏,因为您的“应用自定义色调”用例与公共样式/主题 API 不能很好地配合。 public class MyToolbar extends Toolbar { ... some constructors, extracting mAccentColor from AttrSet, etc @Override public void inflateMenu(@MenuRes int resId) { super.inflateMenu(resId); Menu menu = getMenu(); for (int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i); Drawable icon = item.getIcon(); if (icon != null) { item.setIcon(applyTint(icon)); } } } void applyTint(Drawable icon){ icon.setColorFilter( new PorterDuffColorFilter(mAccentColor, PorterDuff.Mode.SRC_IN) ); } } 只需确保调用您的 Activity/Fragment 代码即可: toolbar.inflateMenu(R.menu.some_menu); toolbar.setOnMenuItemClickListener(someListener); 没有反射,没有视图查找,也没有那么多代码,是吧? 现在你可以忽略荒谬的onCreateOptionsMenu/onOptionsItemSelected。 这是我使用的解决方案;您可以在 onPrepareOptionsMenu() 或等效位置之后调用它。 mutate() 的原因是如果您碰巧在多个位置使用图标;如果没有变异,它们都会呈现相同的色调。 public class MenuTintUtils { public static void tintAllIcons(Menu menu, final int color) { for (int i = 0; i < menu.size(); ++i) { final MenuItem item = menu.getItem(i); tintMenuItemIcon(color, item); tintShareIconIfPresent(color, item); } } private static void tintMenuItemIcon(int color, MenuItem item) { final Drawable drawable = item.getIcon(); if (drawable != null) { final Drawable wrapped = DrawableCompat.wrap(drawable); drawable.mutate(); DrawableCompat.setTint(wrapped, color); item.setIcon(drawable); } } private static void tintShareIconIfPresent(int color, MenuItem item) { if (item.getActionView() != null) { final View actionView = item.getActionView(); final View expandActivitiesButton = actionView.findViewById(R.id.expand_activities_button); if (expandActivitiesButton != null) { final ImageView image = (ImageView) expandActivitiesButton.findViewById(R.id.image); if (image != null) { final Drawable drawable = image.getDrawable(); final Drawable wrapped = DrawableCompat.wrap(drawable); drawable.mutate(); DrawableCompat.setTint(wrapped, color); image.setImageDrawable(drawable); } } } } } 这不会解决溢出问题,但为此,你可以这样做: 布局: <android.support.v7.widget.Toolbar ... android:theme="@style/myToolbarTheme" /> 款式: <style name="myToolbarTheme"> <item name="colorControlNormal">#FF0000</item> </style> 这适用于 appcompat v23.1.0。 这对我有用: override fun onCreateOptionsMenu(menu: Menu?): Boolean { val inflater = menuInflater inflater.inflate(R.menu.player_menu, menu) //tinting menu item: val typedArray = theme.obtainStyledAttributes(IntArray(1) { android.R.attr.textColorSecondary }) val textColor = typedArray.getColor(0, 0) typedArray.recycle() val item = menu?.findItem(R.id.action_chapters) val icon = item?.icon icon?.setColorFilter(textColor, PorterDuff.Mode.SRC_IN); item?.icon = icon return true } 或者你可以在drawable xml中使用tint: <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:tint="?android:textColorSecondary" android:viewportWidth="384" android:viewportHeight="384"> <path android:fillColor="#FF000000" android:pathData="M0,277.333h384v42.667h-384z" /> <path android:fillColor="#FF000000" android:pathData="M0,170.667h384v42.667h-384z" /> <path android:fillColor="#FF000000" android:pathData="M0,64h384v42.667h-384z" /> </vector> @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_home, menu); //One item tint menu.get(itemId).getIcon().setTint(Color); //or all for(int i=0;i<menu.size();i++){ menu.get(i).getIcon().setTint(Color); } return true; } 我发现当我使用 android:iconTint 属性时,菜单项的颜色应用在设计预览中,但没有应用在应用程序中。但是,使用 app:iconTint 应用应用程序中的颜色,而不是设计预览中的颜色。
图像未加载到扩展 AppCompatImageView 的自定义视图类中
我设计了一个名为 PaintView 的自定义类。我的目标是加载用户选择的图像并允许用户像画笔一样绘画或在其上放置不同的形状。 这是我的实现方式...
我的布局看起来有点像这样: ...
如何在 Android Kitkat 中调整 AppCompatRadioButton 的 DrawableLeft 大小?
在 Xamarin Android 应用程序中,我有一个 AppCompatRadioButton,其 drawableLeft 属性设置为 @drawable/person_resized: 在 Xamarin Android 应用程序中,我有一个 AppCompatRadioButton,其 drawableLeft 属性设置为 @drawable/person_resized: <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.AppCompatRadioButton android:id="@+id/MyRadioButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Selection 1" android:textSize="24dp" android:drawableLeft="@drawable/person_resized" android:drawablePadding="5dp" /> </RadioGroup> drawable/person_resized.xml 是一个图层列表可绘制对象,我用它来缩小 drawable/person.png 图像: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/person" android:width="22dp" android:height="22dp" /> </layer-list> 当此视图显示在 Android N 模拟器上时,它的行为正常。 但是在我的 Android Kitkat(4.4.4) 设备中,图像大小不正确。 这是我在 Android N 中得到的: 这是我在 Android Kitkat 中得到的: 这是怎么回事? 我尝试了以下方法来缩小 Android Kitkat 中的 drawableLeft 的大小,但 都不起作用: 使用ScaleDrawable缩小可绘制对象,同时确保SetLevel,这实际上允许调整可绘制对象的大小,但不受控制;无论我提供什么缩放系数,调整大小的图像始终是相同的较小尺寸 从可绘制对象中获取位图,调整其大小并创建一个新的位图可绘制对象,但这会使图像消失 使用插入可绘制对象,与使用图层列表相同,使图像以其原始大小显示 根据Mahmoud Mortda指出的这个答案,Android Kitkat 中的一些功能障碍导致图层列表调整大小被忽略。 所以基本上你必须自己做,以下是我所做的: 我创建了两个文件 layout-v21/radio_group.xml 和 layout/radio_group.xml,前者将用于运行至少 Lollipop (SDK 21) 的 Android 设备,后者将用于包括 KitKat 在内的其余设备。 layout-v21/radio_group.xml 包含通过 RadioGroup 调整大小的图像的 layer-list: <?xml version="1.0" encoding="utf-8"?> <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.AppCompatRadioButton android:id="@+id/MyRadioButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Selection 1" android:textSize="24dp" android:drawableLeft="@drawable/person_resized" android:drawablePadding="5dp" /> </RadioGroup> layout/radio_group.xml 包含一个 RadioGroup,带有由 ImageView 和 TextView 制成的“手工制作”标签: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:id="@+id/RadGroup"> <android.support.v7.widget.AppCompatRadioButton android:id="@+id/MyRadioButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="24dp" /> </RadioGroup> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_toRightOf="@+id/RadGroup" android:layout_centerVertical="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/icon" android:layout_width="22dp" android:layout_height="22dp" android:src="@drawable/person" android:layout_alignParentLeft="true" android:layout_centerVertical="true" /> <TextView android:id="@+id/label1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_toRightOf="@+id/icon" android:layout_centerVertical="true" android:textSize="24dp" android:textColor="@color/black" android:text="Selection 1" /> </RelativeLayout> </RelativeLayout> 这里使用 ImageView 让我可以有效地调整图像大小。 最后,在包含 RadioGroup 的 xml 布局中,只需包含 @layout/radio_group,SDK 将加载针对 Android 版本的正确布局: <include layout="@layout/radio_group"/> 添加RadioButton。 <androidx.appcompat.widget.AppCompatRadioButton android:id="@+id/dialog_pedido_item_produto_desconto_radio_button_desconto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:buttonTint="@color/red_600" android:bufferType="spannable" android:gravity="center" android:drawableStart="@drawable/ic_arrow_downward_red_24dp" android:checked="true" android:padding="@dimen/dp_5" android:text="Desconto" />
如何在Android Studio 4.1中隐藏Action Bar?
我使用的是Android Studio 4.1,我想隐藏操作栏。我搜索了堆栈溢出,但自 getActi 以来,2020 年 10 月的 Android Studio 更新中似乎引入了一些新方法...
如何在没有 AppCompatDelegate 的情况下以编程方式设置 Jetpack Compose 中的语言?
我正在尝试在我的 Jetpack Compose 应用程序中实现语言选择功能。但是,在尝试使用 AppCompactDelegate 来实现此目的时,我遇到了障碍。看来
如何使用 AppCompatDelegate 防止 Jetpack Compose 中区域设置更改时屏幕“闪烁”?
在本文之后,我为我的 Compose 应用程序添加了应用程序内语言选择器。 但每次我更改语言时屏幕都会闪烁。我猜这是由于配置更改造成的 我下载了样本...
Android Google Pay API PayButton 在几秒钟后变得不可见
我正在尝试将 Google Pay API 的本机 PayButton 与我的 React Native 应用程序集成,我认为这个 Android React Native 桥一切都很好: 公共类 GooglePayButtonManager 扩展...
Android Studio build.gradle 错误
当我创建一个新项目时,出现错误: 错误:无法解决:androidx.appcompat:appcompat:1.6.1 添加 Google Maven 存储库并同步项目 在项目结构对话框中显示 受影响的莫杜...
注释 @RequiresApi 对于要求仅在给定的 API 级别或更高级别上调用带注释的元素很有帮助。然而,似乎没有对应的注释
在 Android 13+ 中无法为 BottomSheetDialogFragment 设置 dimAmount
BottomSheetDialogFragment仅接受1.0f的dipAmount(非透明黑色背景),0.99f及以下是完全透明的背景,这似乎只影响API 33+。样式.xml
Android - app:drawableStartCompat 显示错误的颜色
我使用下面的TextView: 我使用下面的TextView: <TextView android:id="@+id/btnBack" style="@style/TextNormal" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:background="?selectableItemBackgroundBorderless" android:padding="@dimen/_8sdp" android:text="@string/common_back" android:textColor="@android:color/white" app:drawableStartCompat="@drawable/ic_back" /> 风格TextNormal <style name="TextNormal"> <item name="android:textColor">@color/colorTextPrimary</item> <item name="android:textColorHint">@color/colorTextSecondary</item> <item name="android:textSize">@dimen/text_normal</item> <item name="android:textStyle">normal</item> </style> icon_back.xml <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="48" android:viewportHeight="48"> <path android:fillColor="#ffffff" android:fillType="evenOdd" android:pathData="M35.556,6.828L17.901,24.484L34.994,41.733L32.176,44.55L12,24.556L15,21.556L15.085,21.643L32.728,4L35.556,6.828Z" /> </vector> XML 文件drawable/ic_back 的颜色为白色。但是在显示时,该图像显示错误的颜色,它不是白色,it same with color primary,所以用户看不到它。 设计: 在设备上运行: 你知道这个bug吗,请帮助我。 我最近遇到了类似的问题。就我而言,我创建的自定义对话框在活动 A 中显示图标,但当转换到活动 B 时,该图标不再可见。我发现问题是 Activity B 不是 AppCompatActivity。属性 app:drawableStartCompat 仅在 AppCompatTextView 中处理,而不在 TextView 中处理。 AppCompatActivity 自动将 TextView 从 XML 转换为 AppCompatTextView。 您可能想通过以下方式验证这一点: 将 app:drawableStartCompat 替换为 android:drawableStart 并确认是否显示。 通过debug或者Log打印来确认实例是TextView还是AppCompatTextView。 如果结果是显示为 android:drawableStart 并且实例是 TextView,那么这可能是问题的原因。
Gradle 错误:无法解析 androidx.appcompat:appcompat:1.0.0
我在使用 Gradle 的 Flutter 项目中尝试解决 androidx.appcompat:appcompat:1.3.0 依赖项时遇到问题。错误消息指出: 无法确定依赖关系...
在新的AppCompat库中,我们可以这样给按钮着色: 在新的 AppCompat 库中,我们可以这样为按钮着色: <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/follow" android:id="@+id/button_follow" android:backgroundTint="@color/blue_100" /> 如何在代码中以编程方式设置按钮的色调? 我基本上是在尝试根据某些用户输入实现按钮的条件着色。 根据文档,与android:backgroundTint相关的方法是setBackgroundTintList(ColorStateList list) 更新 按照此链接了解如何创建颜色状态列表资源。 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:color="#your_color_here" /> </selector> 然后使用加载它 setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.your_xml_name)); 其中 contextInstance 是 Context 的实例 使用AppCompart btnTag.setSupportButtonTintList(ContextCompat.getColorStateList(Activity.this, R.color.colorPrimary)); 你可以使用 button.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.blue_100))); 但我建议您使用昨天刚刚发布的支持库可绘制着色: Drawable drawable = ...; // Wrap the drawable so that future tinting calls work // on pre-v21 devices. Always use the returned drawable. drawable = DrawableCompat.wrap(drawable); // We can now set a tint DrawableCompat.setTint(drawable, Color.RED); // ...or a tint list DrawableCompat.setTintList(drawable, myColorStateList); // ...and a different tint mode DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER); 您可以在这篇博文中找到更多(请参阅“可绘制着色”部分) 似乎视图有自己的色调管理机制,所以最好放置色调列表: ViewCompat.setBackgroundTintList( editText, ColorStateList.valueOf(errorColor)); 这是如何在 kotlin 中做到这一点: view.background.setTint(ContextCompat.getColor(context, textColor)) 通过提供真实的代码情况来正确扩展dimsuz的答案,请参阅以下代码片段: Drawable buttonDrawable = button.getBackground(); buttonDrawable = DrawableCompat.wrap(buttonDrawable); //the color is a direct color int and not a color resource DrawableCompat.setTint(buttonDrawable, Color.RED); button.setBackground(buttonDrawable); 此方案适用于使用drawable作为按钮背景的场景。它也适用于棒棒糖之前的设备。 简单的方法 Java myButton.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.white))); 在 Kotlin 中 myButton.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(context, R.color.white) ) 你尝试过这样的事情吗? button.setBackgroundTintList(getResources().getColorStateList(R.id.blue_100)); 注意 getResources() 只能在 Activity 中使用。但它也可以在每个上下文中调用。 你可以使用类似的东西: myButton.backgroundTintList = AppCompatResources.getColorStateList(context, R.color.primary_variant) 这可以在材料设计库中的新材料按钮中轻松处理,首先,添加依赖项: implementation 'com.google.android.material:material:1.1.0-alpha07' 然后在您的 XML 中,将其用于您的按钮: <com.google.android.material.button.MaterialButton android:id="@+id/accept" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/i_accept" android:textSize="18sp" app:backgroundTint="@color/grayBackground_500" /> 当你想改变颜色时,这里是 Kotlin 中的代码,它没有被弃用,并且可以在 Android 21 之前使用: accept.backgroundTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources, R.color.colorPrimary, theme)) 您可以使用 DrawableCompat 例如 public static Drawable setTint(Drawable drawable, int color) { final Drawable newDrawable = DrawableCompat.wrap(drawable); DrawableCompat.setTint(newDrawable, color); return newDrawable; } 我设法让我的工作正常工作的方法是使用CompoundButtonCompat.setButtonTintList(button, colour)。 据我了解,无论 Android 版本如何,这都有效。 我也有类似的问题。我希望根据颜色(int)值为视图的复杂可绘制背景着色。 我使用代码成功了: ColorStateList csl = new ColorStateList(new int[][]{{}}, new int[]{color}); textView.setBackgroundTintList(csl); 其中color是代表所需颜色的int值。 这代表简单的 xml ColorStateList: <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:color="color here"/> </selector> 希望这有帮助。 如果您使用 Kotlin 和 Material Design,您可以像这样更改 MaterialButton 的颜色: myButton.background.setTintList(ContextCompat.getColorStateList(context, R.color.myColor)) 您可以通过为您的MaterialButton创建扩展函数来更好地改进它,以使您的代码更具可读性并且编码更方便: fun MaterialButton.changeColor(color: Int) { this.background.setTintList(ContextCompat.getColorStateList(context, color)) } 然后,您可以像这样在任何地方使用您的函数: myButton.changeColor(R.color.myColor) 对于 ImageButton 您可以使用: favoriteImageButton.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint 如果您的基于 XML 的颜色状态列表引用主题属性,则此处建议的答案在 android 5.0 上无法正常工作。 例如,我有一个 xml 颜色状态列表,如下所示: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="?colorPrimary" android:state_enabled="true"/> <item android:alpha="0.12" android:color="?attr/colorOnSurface"/> </selector> 使用它作为我的 xml 背景色在 android 5.0 和其他一切上都可以正常工作。但是,如果我尝试在这样的代码中设置它: (不要这样做) myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary)); 实际上,如果我将 Activity 或按钮的上下文传递给 ContextCompat.getColorStateList() 方法并不重要,也不会为我提供与按钮所在主题相关的正确颜色状态列表。这是因为在 api 23 之前不支持在颜色状态列表中使用主题属性,并且 ContextCompat 不会执行任何特殊操作来解决这些问题。相反,您必须使用 AppCompatResources.getColorStateList() 它在设备上执行自己的资源解析/主题属性解析 < API 23. 相反,你必须使用这个: myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary)); TLDR:如果您需要跨所有 Android API 版本解析主题资源,请使用 AppCompatResources 而不是 -ContextCompat-。 有关该主题的更多信息,请参阅本文。 除了Shayne3000的答案之外,您还可以使用颜色资源(不仅仅是int颜色)。 Kotlin 版本: var indicatorViewDrawable = itemHolder.indicatorView.background indicatorViewDrawable = DrawableCompat.wrap(indicatorViewDrawable) val color = ResourcesCompat.getColor(context.resources, R.color.AppGreenColor, null) // get your color from resources DrawableCompat.setTint(indicatorViewDrawable, color) itemHolder.indicatorView.background = indicatorViewDrawable 使用 setBackgroundTintList 有三个选项 int myColor = Color.BLACK; button.setBackgroundTintList(new ColorStateList(EMPTY, new int[] { myColor })); button.setBackgroundTintList(ColorStateList.valueOf(myColor)); button.setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.my_color)); 如果你不想关心不同版本的android,你可以使用这个代码,基本上任何视图。为我工作。 val states = arrayOf(intArrayOf(android.R.attr.state_enabled)) val colors = intArrayOf(Color.GREEN) // your color here val colorStateList = ColorStateList(states, colors) ViewCompat.setBackgroundTintList(yourButtonHere,colorStateList) Kotlin 版本,祝阅读本文的每个人都有美好的一天;) 顺便说一句。如果您创建了一些可绘制的背景形状,这应该仅覆盖色调颜色。 checkbox.ButtonTintList = ColorStateList.ValueOf(Android.Color.White); 使用 ButtonTintList 代替 BackgroundTintList 可以将色调添加到按钮,例如: filterBtn.setBackgroundTintList(ContextCompat.getColorStateList(context,R.color.colorPrimary)) 简单,我们也可以用于图像视图 imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR)); 如果有人想知道如何在背景色调中设置HTML颜色代码(在我的例子中,颜色代码来自后端) String htmlColorCode = "#FF0000"; int colorInt = Color.parseColor(htmlColorCode); View myView = findViewById(R.id.my_view); ViewCompat.setBackgroundTintList(myView, ColorStateList.valueOf(colorInt)); 使用 Kotlin, checkbox.buttonTintList = AppCompatResources.getColorStateList(context, color.colorPrimary)