Android 12 实用更新:置灰的控件也可以点击啦
Posted TechMerger
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 12 实用更新:置灰的控件也可以点击啦相关的知识,希望对你有一定的参考价值。
最近在研究 android 12 源码的时候发现
View
里多了一个有意思的属性allowClickableWhenDisabled
:允许disabled
状态下点击。简单唠唠这个简单明了的小更新。
未点击**“同意”隐私条款的情况下点击“开始”** 按钮 的话,App 会弹出需要勾选的说明或者抖动复选框来加以提示。无论是作为用户还是开发者,对于这种设计应该都不陌生。
开发人员要实现这个小功能的话,简单来说监听勾选情况,适时更新 Button 的 disabled 状态就可以了。但这样一来,当 Button 处于 disabled 状态的时候,它就无法接收点击事件了,进而没法便捷地进行进一步地提示。
这时候为了能够满足设计需求,开发者往往需要自定义 Button 的 Touch 逻辑,或者绕过 disabled 状态自行控制 Button 的背景,甚至于压根不控制 Button 背景色了就让它保持 normal
状态。
点击 Button 无法进行下一步操作的情况下,仍然保持可点击的 UI 效果并不友好。
Android 12 中新引入的 allowClickableWhenDisabled 属性可以让这个小功能的实现变得清晰又简单。
属性 | 说明 |
---|---|
clickable | 可以处理事件,但 disabled 状态下的话无法处理,而是直接消费 |
allowClickableWhenDisabled | 可以处理事件,即便处于 disabled 状态 |
看一下简单的示例代码:
- 在置灰的控件上设置 allowClickWhenDisabled 为 true 即可,当然通过代码调用
setAllowClickWhenDisabled()
也可以
<android.support.constraint.ConstraintLayout ... >
<Button
android:onClick="clickView"
android:enabled="false"
android:allowClickWhenDisabled="true"
... />
</android.support.constraint.ConstraintLayout>
- 接着在 Button 点击的事件里判断当前是否为 disabled 状态,继而决定是提示用户等操作还是放行点击动作。
fun clickView(view: View)
if (view.isEnabled)
// Go on
// ...
else
// Show warning tips
Toast.makeText(
this@MainActivity,
"Disabled, u need click yes first!",
Toast.LENGTH_SHORT
).show()
效果:
来看一下这个更新的具体提交和源码。
commit 911dd88ca6306519f4fbdba10c388aa70a2ee20e
Author: Priyank Singh priyanksingh@google.com
Date: Fri Mar 27 15:09:16 2020 -0700
Add attr allowClickWhenDisabled for the new API View#setAllowClickWhenDisabled
// View.java
private static final int PFLAG4_ALLOW_CLICK_WHEN_DISABLED = 0x000001000;
public void setAllowClickWhenDisabled(boolean clickableWhenDisabled)
if (clickableWhenDisabled)
mPrivateFlags4 |= PFLAG4_ALLOW_CLICK_WHEN_DISABLED;
else
mPrivateFlags4 &= ~PFLAG4_ALLOW_CLICK_WHEN_DISABLED;
public boolean onTouchEvent(MotionEvent event)
...
if ((viewFlags & ENABLED_MASK) == DISABLED
&& (mPrivateFlags4 & PFLAG4_ALLOW_CLICK_WHEN_DISABLED) == 0)
...
return clickable;
if (clickable || (viewFlags & TOOLTIP) == TOOLTIP)
switch (action)
...
...
逻辑很简单,在 onTouchEvent() 里发现 disabled 状态且没有设置 allowClickableWhenDisabled 的话才会不发送事件直接消费。一旦控件设置了 allowClickableWhenDisabled 属性,就可以继续处理事件了。
这是 Android 12 众多更新中容易忽略、却很实用的一个小更新,大家可以留意一下,日后遇到类似的需求也用得上!
以上是关于Android 12 实用更新:置灰的控件也可以点击啦的主要内容,如果未能解决你的问题,请参考以下文章