Android 12 实用更新:置灰的控件也可以点击啦

简介: Android 12 实用更新:置灰的控件也可以点击啦

最近在研究 Android 12 源码的时候发现 View 里多了一个有意思的属性 allowClickableWhenDisabled:允许 disabled 状态下点击。

简单唠唠这个简单明了的小更新。

未点击**“同意”隐私条款的情况下点击“开始”** 按钮 的话,App 会弹出需要勾选的说明或者抖动复选框来加以提示。无论是作为用户还是开发者,对于这种设计应该都不陌生。


开发人员要实现这个小功能的话,简单来说监听勾选情况,适时更新 Button 的 disabled 状态就可以了。但这样一来,当 Button 处于 disabled 状态的时候,它就无法接收点击事件了,进而没法便捷地进行进一步地提示。


这时候为了能够满足设计需求,开发者往往需要自定义 Button 的 Touch 逻辑,或者绕过 disabled 状态自行控制 Button 的背景,甚至于压根不控制 Button 背景色了就让它保持 normal 状态。

image.png点击 Button 无法进行下一步操作的情况下,仍然保持可点击的 UI 效果并不友好。

Android 12 中新引入的 allowClickableWhenDisabled 属性可以让这个小功能的实现变得清晰又简单。

属性 说明
clickable 可以处理事件,但 disabled 状态下的话无法处理,而是直接消费
allowClickableWhenDisabled 可以处理事件,即便处于 disabled 状态

看一下简单的示例代码:

  1. 在置灰的控件上设置 allowClickWhenDisabled 为 true 即可,当然通过代码调用 setAllowClickWhenDisabled() 也可以
<android.support.constraint.ConstraintLayout ... >
    <Button
        android:onClick="clickView"
        android:enabled="false"
        android:allowClickWhenDisabled="true"
        ... />
</android.support.constraint.ConstraintLayout>
  1. 接着在 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()
        }
    }

效果:

image.gif

来看一下这个更新的具体提交和源码。


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 众多更新中容易忽略、却很实用的一个小更新,大家可以留意一下,日后遇到类似的需求也用得上!


相关文章
|
3月前
|
XML Android开发 数据格式
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
92 2
|
5天前
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
12 0
|
2月前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
1月前
|
XML 数据格式
Android-自定义三角形评分控件
Android-自定义三角形评分控件
22 0
|
2月前
|
Java Android开发
18. 【Android教程】图片控件 ImageView
18. 【Android教程】图片控件 ImageView
34 4
|
2月前
|
XML Android开发 数据格式
Android基础控件介绍
Android基础控件介绍
24 0
|
2月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
55 2
|
2月前
|
Java Android开发 开发者
17. 【Android教程】开关控件ToggleButton/Switch
17. 【Android教程】开关控件ToggleButton/Switch
35 2
|
2月前
|
Android开发
Android 自定义View 测量控件宽高、自定义viewgroup测量
Android 自定义View 测量控件宽高、自定义viewgroup测量
31 0
|
3月前
|
XML Java Android开发
Android控件动态使用 (转)
Android控件动态使用 (转)
22 1