AppCompate設(shè)置背景不生效原因排查

問題

遇到一個問題使用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è)置進去。


image.png

image.png

原因

因為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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容