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


相关文章
|
XML Android开发 数据格式
Android利用selector(选择器)实现图片动态点击效果
本文介绍了Android中ImageView的`src`与`background`属性的区别及应用,重点讲解如何通过设置背景选择器实现图片点击动态效果。`src`用于显示原图大小,不拉伸;`background`可随组件尺寸拉伸。通过创建`selector_setting.xml`,结合`setting_press.xml`和`setting_normal.xml`定义按下和正常状态的背景样式,提升用户体验。示例代码展示了具体实现步骤,包括XML配置和形状定义。
628 3
Android利用selector(选择器)实现图片动态点击效果
|
机器学习/深度学习 Android开发 数据安全/隐私保护
手机脚本录制器, 脚本录制器安卓,识图识色屏幕点击器【autojs】
完整的UI界面,包含录制控制按钮和状态显示 屏幕点击动作录制功能,记录点击坐标和时间间隔
|
XML 搜索推荐 Android开发
Android改变进度条控件progressbar的样式(根据源码修改)
本文介绍了如何基于Android源码自定义ProgressBar样式。首先分析了系统源码中ProgressBar样式的定义,发现其依赖一张旋转图片实现动画效果。接着分两步指导开发者实现自定义:1) 模仿源码创建一个旋转动画XML文件(放置在drawable文件夹),修改图片为自定义样式;2) 在UI控件中通过`indeterminateDrawable`属性应用该动画。最终实现简单且个性化的ProgressBar效果,附带效果图展示。
735 2
|
Android开发
Android控件样式的抽取(小提及快捷方式)
在Android开发中,若多个控件样式重复,可抽取公共部分以简化代码。例如对EditText提取样式,通过编辑`styles.xml`实现复用。为提高效率,Android Studio提供自动提取Style功能:右键点击控件样式选项,选择“Style...”,勾选需要提取的属性后确认,即可快速生成样式代码,显著提升开发便利性。
397 2
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
286 3
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
253 0
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
Java Android开发
18. 【Android教程】图片控件 ImageView
18. 【Android教程】图片控件 ImageView
681 4
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
1036 3
|
Java Android开发 开发者
17. 【Android教程】开关控件ToggleButton/Switch
17. 【Android教程】开关控件ToggleButton/Switch
1024 2

热门文章

最新文章