首页 > 解决方案 > 为什么我的布局在更改设备主题时会继承下一个元素的属性?

问题描述

我有两个看起来像这样的按钮:

        <co.proxy.uicomponents.buttons.LargeLoadingButtonWidget
            android:id="@+id/accept_button"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/grid_1"
            android:paddingHorizontal="@dimen/dimen_page_margin"
            android:text="@string/accept_action"
            app:base_button_style="black"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/half_buttons_guideline"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    <co.proxy.uicomponents.buttons.LargeLoadingButtonWidget
        android:id="@+id/not_now_button"
        android:layout_width="match_parent"
        android:paddingHorizontal="@dimen/dimen_page_margin"
        android:layout_height="wrap_content"
        android:text="@string/share_health_information_not_now_action"
        app:base_button_style="transparent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

根布局是一个约束布局,accept_button 在一个嵌套的约束布局内。它们是自定义按钮,单击时具有动画资源。当被点击时,它们都可以完美地工作。他们完美地过渡到动画。

按钮具有不同的外观,由 定义base_button_style

我的这个按钮的资源看起来像

<attr name="base_button_style" format="enum">
        <enum name="black" value="0" />
        <enum name="grey" value="1" />
        <enum name="transparent" value="2" />
        <enum name="red" value="3" />
        <enum name="white" value="4" />
        <enum name="dark_grey" value="5" />
        <enum name="black_outline" value="6" />
    </attr>

    <declare-styleable name="BaseLoadingButtonWidget">
        <attr name="android:enabled" />
        <attr name="android:text" />
        <attr name="base_button_style" />
    </declare-styleable>

在我的按钮小部件中,我有一些选择器代码,它知道根据这个枚举值选择哪个按钮。

sealed class ButtonState(val buttonText: String) : Widget.State {
    class Black(buttonText: String) : ButtonState(buttonText)
    class Grey(buttonText: String) : ButtonState(buttonText)
    class Transparent(buttonText: String) : ButtonState(buttonText)
    class Red(buttonText: String) : ButtonState(buttonText)
    class White(buttonText: String) : ButtonState(buttonText)
    class MediumGrey(buttonText: String) : ButtonState(buttonText)
    class BlackOutline(buttonText: String) : ButtonState(buttonText)

    companion object {
        fun getStateFromValue(value: Int, actionText: String): ButtonState {
            return when (value) {
                0 -> Black(actionText)
                1 -> Grey(actionText)
                2 -> Transparent(actionText)
                3 -> Red(actionText)
                4 -> White(actionText)
                5 -> MediumGrey(actionText)
                6 -> BlackOutline(actionText)
                else -> Black(actionText)
            }
        }
    }
}

每个按钮都有自己的动画。对于这个例子,黑色按钮有一个白色的动画,而对于透明按钮,动画是黑色的。

当我点击按钮时,它使用正确的动画颜色。

我的应用程序不支持深色主题,在我使用的 App.kt 中

AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)哪个有效。

如果我终止应用程序并打开深色主题,然后重新启动应用程序,一切都会按预期工作。

如果我终止应用程序并打开浅色主题,然后重新启动应用程序,情况也是如此。

那里没有问题。

问题是如果我打开应用程序,切换到设置,切换到深色(或浅色)主题,然后切换回仍然打开的应用程序,accept_button 现在使用透明按钮资源进行动画。所以动画变成黑色而不是白色,导致出现带有黑色动画的黑色按钮,所以按钮看起来在加载时什么都不做。

我上面列出的布局是一个活动,而不是片段。我试图更新 AppCompat 库但没有成功。每当我在我的自定义 LargeLoadingButtonWidget 中检查 ID 和匹配时,一切都匹配并且它正在做它应该做的事情。它根据提供的 ID 选择适当的资源。base_button_style但就我而言,当我在应用程序打开时切换系统主题时,它似乎混淆了按钮。

我将重申我的应用程序根本没有黑暗主题。

活动的初始化看起来像

@FlowPreview
@ExperimentalCoroutinesApi
@AndroidEntryPoint
class HealthShareRequestActivity: AppCompatActivity() {

    private val binding by viewBinding(ActivityHealthShareRequestBinding::inflate)
    private val viewModel by viewModels<HealthShareRequestViewModel>()
    private val orgId: String by extra(ORG_ID)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        initUI()
        registerListeners()
        registerObservers()
    }

所以我们在这里使用视图绑定。并且动画都是通过 setAnimation 设置的抽奖动画。

标签: androidbindingthemes

解决方案


推荐阅读