android - 为什么我的布局在更改设备主题时会继承下一个元素的属性?
问题描述
我有两个看起来像这样的按钮:
<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 设置的抽奖动画。
解决方案
推荐阅读
- javascript - 动态表中的动态按钮句柄单击
- sql - 如何使用 SQL 获取列中每个分区的第一个和最后一个值
- r - 计算数据框中组内出现的比率
- javascript - webgl纹理格式,类型和internalFormat的无效组合
- javascript - 在将对象的 getter 下划线发送到 API 之前对其进行规范化
- bash - bash,测试curl是否存在,如果不存在则安装
- c++ - 如何消除并行 std::transform_reduce() 的中间容器?
- javascript - 当输入数量未知时如何从 Material UI 输入中获取值
- php - PHP 中的嵌套 API 调用
- django - 此字段是必需的。Dajngo 休息框架