问题
遇到一个问题使用AppCompateButton设置背景不生效,百度了一下也看到有人说AppCompate设置后背景不生效问题,主要原因和主题有关。于是我分析了相关的主题,因为把appcompate从1.2.0升级到1.3.1了,所以分析一顿后走了不少弯路。
代码如下:
.setTitle("title")
.setMessage("messsssssssssssssssssage")
.setPositiveButton("ok", null)
.setNegativeButton("no", null)
.create();
dialog.show();
其中AlertDialogThemed定义为
<style name="AlertDialogThemed" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:background">#fff</item>
<item name="android:buttonStyle">@style/dialog_button_style</item>
</style>
<style name="dialog_button_style">
<item name="android:textColor">#000</item>
<item name="android:backgroundTint">@null</item>
<item name="android:background">#ff1</item>
</style>
这个activity所设置的theme为:
<activity
android:name=".fragmentlicycle.FragmentDemoActivity"
android:exported="true"
android:theme="@style/AppTheme.FullScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<style name="AppTheme.FullScreen" parent="android:Theme.Light">
<item name="android:windowContentOverlay">@null</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="colorPrimaryDark">@color/black</item>
<item name="android:navigationBarColor">@color/black</item>
</style>
但是出来的效果是这样,本来底部按钮应该是黄底黑字的,但是这里没有生效,单独只有按钮的背景不生效,通过layoutInspector中可以看到背景没有设置进去。
原因
因为dailog的layout是通过主题来设置的,而主题又是一个一个继承,需要深挖的,所以一时不好找到对应的layout是哪一个。所以从layoutInspector中看layout布局,然后全局搜索关键的控件布局,基本可以锁定layout布局应该是长这样:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/buttonPanel"
style="?attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
android:scrollIndicators="top|bottom">
<androidx.appcompat.widget.ButtonBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="bottom"
android:layoutDirection="locale"
android:orientation="horizontal"
android:paddingLeft="?attr/dialogPreferredPadding"
android:paddingRight="?attr/dialogPreferredPadding"
android:paddingTop="@dimen/m3_alert_dialog_action_top_padding"
android:paddingBottom="@dimen/m3_alert_dialog_action_bottom_padding">
<Button
android:id="@android:id/button3"
style="?attr/buttonBarNeutralButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<android.widget.Space
android:id="@+id/spacer"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"
android:visibility="?attr/materialAlertDialogButtonSpacerVisibility"/>
<Button
android:id="@android:id/button2"
style="?attr/buttonBarNegativeButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@android:id/button1"
style="?attr/buttonBarPositiveButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.appcompat.widget.ButtonBarLayout>
</ScrollView>
从这份layout可以得出,按钮的背景应该再style里设置,例如这个:style="?attr/buttonBarPositiveButtonStyle"
,所以我们覆写这个属性试试。
[图片上传中...(image.png-b7ada6-1658391905489-0)]
果然生效了。
全局收一下设置的地方,发现三个按钮对应的style都可以指向buttonBarButtonStyle,所以如果样式一样的话,可以直接设置buttonBarButtonStyle
<item name="buttonBarPositiveButtonStyle">?attr/buttonBarButtonStyle</item>
<item name="buttonBarNegativeButtonStyle">?attr/buttonBarButtonStyle</item>
<item name="buttonBarNeutralButtonStyle">?attr/buttonBarButtonStyle</item>
修改
把android:buttonStyle改成buttonBarButtonStyle就可以了。
<style name="AlertDialogThemed" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:background">#fff</item>
<item name="buttonBarButtonStyle">@style/dialog_button_style</item>
</style>