AppCompate设置背景不生效原因排查

2022-07-20  本文已影响0人  小马要加油

问题

遇到一个问题使用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中可以看到背景没有设置进去。


image.png
image.png

原因

因为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>
上一篇下一篇

猜你喜欢

热点阅读