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


相关文章
|
2月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
47 0
|
3月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
58 3
|
4月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
4月前
|
Android开发
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
71 0
|
6月前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
6月前
|
Java Android开发
18. 【Android教程】图片控件 ImageView
18. 【Android教程】图片控件 ImageView
104 4
|
6月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
228 2
|
6月前
|
Java Android开发 开发者
17. 【Android教程】开关控件ToggleButton/Switch
17. 【Android教程】开关控件ToggleButton/Switch
84 2
|
5月前
|
XML 数据格式
Android-自定义三角形评分控件
Android-自定义三角形评分控件
48 0
|
6月前
|
XML Android开发 数据格式
Android基础控件介绍
Android基础控件介绍