Android App Widget中RemoteViews的Button样式设置及图标显示问题
问题描述
想要创建一个带有若干Icon Button的简易App Widget,已知RemoteViews仅支持部分简单视图,因此尝试为Button设置如下样式:
<Button android:id="@+id/leave_sheet" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?attr/materialIconButtonFilledTonalStyle" app:icon="@drawable/ic_outline_delete_24" tools:ignore="ContentDescription" />
Android Studio布局预览显示正常,但运行应用后图标无法显示。请问如何解决该问题?或者有没有办法实现类似Google Drive和Google Keep的Material You风格Icon Button?
解决方案
问题原因
RemoteViews对自定义属性和Material高级组件的支持非常有限,app:icon属于Material Button的专属自定义属性,materialIconButtonFilledTonalStyle这类Material You风格样式也无法在App Widget的RemoteViews环境中生效,这就是预览正常但实际运行不显示图标的核心原因。
替代实现方案
以下两种方法可以实现类似Material You风格的Icon Button效果:
用ImageView模拟Icon Button
RemoteViews完全支持ImageView,可通过设置背景和图标来模拟填充色调按钮样式:<ImageView android:id="@+id/leave_sheet" android:layout_width="48dp" android:layout_height="48dp" android:src="@drawable/ic_outline_delete_24" android:background="?attr/materialButtonFilledTonalBackground" android:padding="12dp" android:clickable="true" android:focusable="true" tools:ignore="ContentDescription" />注意:需确保项目已引入Material Components库,且应用主题继承自
Theme.Material3.*系列,否则materialButtonFilledTonalBackground属性无法生效。添加按压交互效果的进阶实现
如果需要贴近原生Material Icon Button的按压、聚焦状态效果,可创建状态列表drawable作为背景:- 在
res/drawable目录下创建btn_filled_tonal_selector.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="?attr/materialButtonFilledTonalPressedBackground" /> <item android:state_focused="true" android:drawable="?attr/materialButtonFilledTonalFocusedBackground" /> <item android:drawable="?attr/materialButtonFilledTonalBackground" /> </selector>- 将ImageView的背景替换为该状态列表:
<ImageView android:id="@+id/leave_sheet" android:layout_width="48dp" android:layout_height="48dp" android:src="@drawable/ic_outline_delete_24" android:background="@drawable/btn_filled_tonal_selector" android:padding="12dp" android:clickable="true" android:focusable="true" tools:ignore="ContentDescription" />- 在
关键注意事项
- App Widget的RemoteViews仅支持TextView、ImageView、Button等基础系统控件,不支持
MaterialButton这类Material高级组件。 - 布局中只能使用RemoteViews可解析的系统属性,自定义属性无法被识别生效。
内容的提问来源于stack exchange,提问作者bqliang
相关产品推荐
相关产品推荐

