問題
遇到一個問題使用AppCompateButton設(shè)置背景不生效,百度了一下也看到有人說AppCompate設(shè)置后背景不生效問題,主要原因和主題有關(guān)。于是我分析了相關(guān)的主題,因為把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所設(shè)置的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>
但是出來的效果是這樣,本來底部按鈕應(yīng)該是黃底黑字的,但是這里沒有生效,單獨只有按鈕的背景不生效,通過layoutInspector中可以看到背景沒有設(shè)置進去。


原因
因為dailog的layout是通過主題來設(shè)置的,而主題又是一個一個繼承,需要深挖的,所以一時不好找到對應(yīng)的layout是哪一個。所以從layoutInspector中看layout布局,然后全局搜索關(guān)鍵的控件布局,基本可以鎖定layout布局應(yīng)該是長這樣:
<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可以得出,按鈕的背景應(yīng)該再style里設(shè)置,例如這個:style="?attr/buttonBarPositiveButtonStyle",所以我們覆寫這個屬性試試。
[圖片上傳中...(image.png-b7ada6-1658391905489-0)]
果然生效了。
全局收一下設(shè)置的地方,發(fā)現(xiàn)三個按鈕對應(yīng)的style都可以指向buttonBarButtonStyle,所以如果樣式一樣的話,可以直接設(shè)置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>