首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在按下按钮时执行任何代码?

如何在按下按钮时执行任何代码?
EN

Stack Overflow用户
提问于 2022-08-12 09:43:22
回答 2查看 79关注 0票数 0

我有一个buttonimageView,我需要执行一些在按button时更改图像属性的代码。但我不知道如何实现这一点。我试图通过执行代码来使用onTouchListener

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while(event?.action != MotionEvent.ACTION_UP)

但它会导致应用程序挂起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-12 11:31:29

当您获得ACTION_DOWN事件(即用户按下您的View)时,您希望启动您的任务(不管是什么),并在您得到ACTION_UP事件(用户已经举起手指或其他什么)或ACTION_CANCEL (例如,用户将其手指拖出View之外)时停止它。

这会让你在按钮保持行为的时候。但是该任务需要异步运行--协同机制、线程、发布到主活套中的延迟Runnable (您可以通过调用post方法之一的View来完成这一任务)。

您不能只在循环中旋转,在代码运行完之前,系统不能做任何其他事情(包括显示UI更改和响应触摸)。如果您在阻塞线程时等待一个ACTION_UP,则不会得到一个。(无论如何,新的MotionEvent将通过稍后的函数调用。)

下面是一个使用活套的简单示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MainFragment : Fragment(R.layout.fragment_main) {

    lateinit var binding: FragmentMainBinding

    // This is a reusable Runnable that changes a background, then reposts itself
    // to the task queue to run again in the future.
    private val colourCycleTask = object : Runnable {
        private fun rnd() = (0..255).random()
        
        override fun run() {
            binding.someView.setBackgroundColor(Color.rgb(rnd(), rnd(), rnd()))
            binding.someView.postDelayed(this, 250L)
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding = FragmentMainBinding.bind(view)
        binding.button.addHoldListener()
    }

    private fun View.addHoldListener() {
        setOnTouchListener { view, event ->
            var handled = true
            when(event.action) {
                MotionEvent.ACTION_DOWN -> view.post(colourCycleTask) // run the task
                MotionEvent.ACTION_UP -> {
                    view.removeCallbacks(colourCycleTask) // remove the task from the queue
                    view.performClick()
                }
                MotionEvent.ACTION_CANCEL -> view.removeCallbacks(colourCycleTask)
                else -> handled = false
            }
            handled
        }
    }
    
}

将一个Runnable发布到主Looper基本上是在任务队列中添加一些代码--所以您没有阻塞线程,也没有阻止任何其他事情发生,而是对系统说“嘿,请在这个时候这样做”,它会尽力做到这一点。而且,由于Runnable在最后重新发布了自己,所以在允许其他代码运行的同时,您会得到这种循环行为,因为您没有控制执行。您只是推迟了一些稍后运行的代码,然后允许继续执行。

我认为Coroutines是一种更整洁的方法,但我喜欢以Looper为例,因为它自古以来就是Android的一部分,而且当您的主线程工作需要延迟或运行相当长的时间时,它可以是一种简单的方法来获得这种行为。

票数 0
EN

Stack Overflow用户

发布于 2022-08-12 10:46:57

你不能只在主线程中做无限循环,它会挂起你的应用程序。但是,可以执行不阻塞主线程的异步代码。科特林合作机制能帮上忙。

如果在项目中使用kotlin协同器,则可以在ACTION_DOWN事件上启动一个具有无限循环的新协同线。并取消ACTION_UP事件上的相应作业:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var job: Job? = null
button.setOnTouchListener { v, event ->
    when (event.action) {
        ACTION_DOWN -> {
            job = launch {
                while (true) {
                    // increasing counter as an example:
                    textView.text = "${counter++}"
                    delay(100)
                }
            }
        }
        ACTION_UP -> {
            job?.cancel()
        }
    }
    false
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73337968

复制
相关文章
面试官:SpringBoot 启动时如何自动执行代码?
哈喽,我是狗哥,在日常开发中,SpringBoot项目在启动的时候需要预加载一些资源。而如何实现启动过程中执行代码,或启动成功后执行,是有很多种方式可以选择,我们可以在static代码块中实现,也可以在构造方法里实现,还可以使用@PostConstruct注解实现。
JavaFish
2022/03/15
4930
面试官:SpringBoot 启动时如何自动执行代码?
Windows 下 Python如何执行
在Windows 系统下安装好Pyton后,直接在CMD命令提示符号里 输入CD .py的文件路径, 进入.py文件的所在目录,例如 cd c:\python33\study,进入这个目录后 输入 Python .py文件名 回车就执行了.py文件。
py3study
2020/01/09
7230
Windows 下 Python如何执行
pycharm如何执行代码_pycharm如何运行代码
首先在pycharm 中的python 文件,比如:test.py,右键点击 show in explore,会弹出test.py的所在的文件夹,如图所示:
全栈程序员站长
2022/09/27
1.1K0
pycharm如何执行代码_pycharm如何运行代码
error信息显示状态下按钮按下时error不消失问题
当画面增加一个按钮,在输入框表示error状态下,按下按钮,error信息还是没有消失,即使在按下事件中已经设置了setCustomValidity()方法,还是没有起效。
repick
2021/11/25
1.5K0
error信息显示状态下按钮按下时error不消失问题
Jenkins如何执行pipeline代码
这种方式是不是很简单? 就是每次在web页面写 有点无聊,下面我们试试写成独立的文件。
苦叶子
2019/11/21
1.4K0
Jenkins如何执行pipeline代码
我的Js代码-按钮按下时判断是否选择了最后一行,给出提示
<script language="javascript"> <!-- function onsub() { //生成新月的字符串 var nian=Number(document.all("ListBox1",0).value.substring(0,4)); var yue=Number(document.all("ListBox1",0).value.substring(4,6)); if(yue==12)
用户1075292
2018/01/23
3.6K0
mysql下如何执行sql脚本
首要步骤(一般可省略): 开启mysql服务(默认是开机时就自动运行了): 控制面板-->管理工具-->服务,在里面找到名称为mysql的项,双击就可看它的服务状态是启动还是停止,把它设为启动 连接mysql: 在命令行下输入 mysql -h localhost -u root -p回车,然后输入密码即可;或直接运行mysql自
用户1258909
2018/07/03
3.4K0
php代码执行函数_php代码如何运行
大家好,又见面了,我是你们的朋友全栈君。 ** php代码执行函数解析 ** ​一、代码执行漏洞原理: 用户输入的数据被当做后端代码进行执行 <?php @eval($_REQUEST[8])?>
全栈程序员站长
2022/11/10
15.9K0
php代码执行函数_php代码如何运行
SpringBoot 启动时自动执行代码的几种方式
目前开发的SpringBoot项目在启动的时候需要预加载一些资源。如何实现启动过程中执行代码,或启动成功后执行,是有很多种方式可以选择,可以在static代码块中实现,也可以在构造方法里实现,也可以使用@PostConstruct注解实现。
鱼找水需要时间
2023/02/16
1.2K0
SpringBoot 启动时自动执行代码的几种方式
Android设备如何执行smali代码
java代码的执行需要编译成字节码文件然后借助java虚拟机JVM执行, 那么smali代码的执行同样需要借助虚拟机, 只不过是安卓虚拟机DalvikVM, 但是由于Dalvik虚拟机默认识别dex文件, 因此需要将smali文件封装成dex文件 1.创建smali文件 .class public LTest; .super Ljava/lang/Object; .method public constructor <init>()V .registers 1 invoke-di
乱码三千
2021/08/24
6290
Linux下如何快速执行历史命令
我们注意到,列出的历史命令前有一个数字,其实要想执行某个特定历史命令,只需要!+数字即可:
编程珠玑
2020/03/25
3.9K0
WPF 绑定命令在 MVVM 的 CanExecute 和 Execute 在按钮点击都没触发可能的原因
在 WPF 推荐使用 MVVM 绑定命令,但是绑定命令会存在很多坑,其中一个就是焦点的问题。如果在用户点击按钮的时候出现了焦点修改,那么此时的命令是不会被触发
林德熙
2022/08/04
2K0
视频流媒体平台如何在按需直播情况下随时调用直播视频流?
视频的播放都是需要消耗带宽及流量的,之前我们介绍过安防视频监控流媒体服务器系统对网络带宽的要求,由于有带宽及服务器的限制,在我们的流媒体平台都添加了“按需直播”的选择,以节省带宽。
EasyNVR
2020/06/16
1.2K0
JavaScript代码是如何被执行的
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。根据语言的执行流程,可以把语言分成编译型语言和解释型语言。
木子星兮
2020/07/16
1.1K0
Spring Boot 启动时自动执行代码的几种方式
目前开发的SpringBoot项目在启动的时候需要预加载一些资源。而如何实现启动过程中执行代码,或启动成功后执行,是有很多种方式可以选择,我们可以在static代码块中实现,也可以在构造方法里实现,也可以使用@PostConstruct注解实现。 当然也可以去实现Spring的ApplicationRunner与CommandLineRunner接口去实现启动后运行的功能。在这里整理一下,在这些位置执行的区别以及加载顺序。 java自身的启动时加载方式 static代码块 static静态代码块,在类加载的
程序猿DD
2022/05/31
2K0
Spring Boot 启动时自动执行代码的几种方式
如何在 Chrome 中执行 JavaScript 代码
要在浏览器中执行 JavaScript 脚本,首先你的浏览器得支持。现在主流推荐 Chrome 浏览器,也可以使用基于 Chromium 的 Edge 浏览器。下面来介绍如何在 Chrome 中打开开发者工具,以及如何在开发者工具中运行调试 JavaScript 代码。
村雨遥
2022/03/14
6.1K0
如何在 Chrome 中执行 JavaScript 代码
CPU 是如何执行代码指令的?
现在我们拿到了指令,前四位是操作码对应的是指令表中的LOAD A指令。对应的描述是将RAM的值放入寄存器A
北洋
2023/09/21
4750
Layer 弹窗 回车执行确定按钮事件
在 layer 弹层组件中,其确认按钮需要通过鼠标点击,而在实际需求中,我们往往想要通过回车就能够执行确定按钮事件,代码如下所示:
Nian糕
2018/08/21
3.3K0
Layer 弹窗 回车执行确定按钮事件
如何使用WorkManager执行后台任务(下)
在上一文中已经了解到 WorkManager的基本用法之后,今天来看看它的一些高级用法:
阳仔
2019/07/30
7870
如何使用WorkManager执行后台任务(下)
点击加载更多

相似问题

如何在按下Home按钮时执行代码?

70

在按下按钮之前,如何执行代码?

20

在按下按钮时执行操作

11

在按下按钮时执行PHP

20

Asp.net在按下按钮时执行html代码

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文