Android onTouch 与 onClick 和 onLongClick

2023-11-21

我有一个自定义视图,其作用类似于按钮。我想在用户按下它时更改背景,当用户将手指移到外面或释放它时将背景恢复为原始状态,我还想处理 onClick/onLongClick 事件。问题是 onTouch 要求我返回 trueACTION_DOWN否则它不会向我发送ACTION_UP事件。但如果我返回 trueonClick听众将无法工作。

我想我通过在 onTouch 中返回 false 并注册 onClick 来解决它 - 它以某种方式起作用,但有点违反文档。我刚刚收到用户的消息,告诉我他无法长按按钮,所以我想知道这里出了什么问题。

当前代码的一部分:

public boolean onTouch(View v, MotionEvent evt)
{
  switch (evt.getAction())
  {
    case MotionEvent.ACTION_DOWN:
    {
      setSelection(true); // it just change the background
      break;
    }

    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_OUTSIDE:
    {
      setSelection(false); // it just change the background
      break;
    }
  }

  return false;
}

public void onClick(View v)
{
  // some other code here
}

public boolean onLongClick(View view)
  {
    // just showing a Toast here
    return false;
  }


// somewhere else in code
setOnTouchListener(this);
setOnClickListener(this);
setOnLongClickListener(this);

我如何让它们正确地协同工作?

提前致谢


onClick & onLongClick实际上是从View.onTouchEvent.

如果你覆盖View.onTouchEvent或者设置一些具体的View.OnTouchListener via setOnTouchListener, 你必须关心这一点。

所以你的代码应该是这样的:



public boolean onTouch(View v, MotionEvent evt)
{
  // to dispatch click / long click event,
  // you must pass the event to it's default callback View.onTouchEvent
  boolean defaultResult = v.onTouchEvent(evt);

  switch (evt.getAction())
  {
    case MotionEvent.ACTION_DOWN:
    {
      setSelection(true); // just changing the background
      break;
    }
    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_OUTSIDE:
    {
      setSelection(false); // just changing the background
      break;
    }
    default:
      return defaultResult;
  }

  // if you reach here, you have consumed the event
  return true;
}
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android onTouch 与 onClick 和 onLongClick 的相关文章

随机推荐

  • 同步执行 Sequelize 查询

    我正在使用 Node js 和 Sequelize 带有 Postgres 后端 构建一个网站 我有一个查询返回许多带有外键的对象 并且我想将外键引用的对象列表传递给视图 在示例中 出勤包含黑客马拉松密钥 我想返回黑客马拉松列表 由于代码是
  • 无法使用 matplotlib.use('Agg'),图形始终显示在屏幕上

    我正在研究 matplotlib 不知道如何保存图形而不将其打印在屏幕上 所以我在网上做了一些研究 很多答案都说解决方案是 matplotlib use Agg 并且必须在导入 matplotlib pyplot 或 pylab 之前 然后
  • .NET 流、在对象之间传递流、最佳实践 (C#)

    我目前正在用 c 编写一个小玩具汇编程序 正在经历计算系统要素图书目录 顺便说一句 确实是一本好书 汇编器采用输入文件路径并删除垃圾 注释等 行 然后该文件被传递到解析器 最后传递到创建二进制代码的另一个模块 这并不太复杂 但我不想每次一个
  • 使用指针和比较器 C++ 的优先级队列

    我刚刚开始学习C 有一半的时间我不知道我在做什么 花几个小时在Google上搜索并盲目地将代码放入我的项目中 这可能是一个基本问题 但我似乎做不到把它做好 这是要求对于我的任务 我需要这些 在边缘类中 public bool operato
  • 如何将 Cocoa 应用程序设置为默认 Web 浏览器?

    如何将 Cocoa 应用程序设置为默认 Web 浏览器 我想创建一个当用户单击其他应用程序 邮件 iChat 等 中的 HTTP 或 HTTPS 链接时默认启动的应用程序 制作可充当默认网络浏览器的应用程序有四个步骤 前三个步骤允许您的应用
  • 如何将 Google 地图库与 Flutter Web 结合使用? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在将一个 flutter 移动项目移植到 flutter web 并且想知道如何将 google 地图库与 Flutter Web 一起使用 请
  • 如何使用 javascript 从字符串中删除 `//` ?

    如何去除 使用来自字符串的javascript var title 需要成为 var title A Survey of Applications of Identity Based Cryptography in Mobile Ad Ho
  • 有没有更好的方法来确定 UITableViewCell 的正确大小?

    我有一个 UITableView 单元格 该单元格的大小将根据其内容 可能是几行文本 而变化 既然看起来 heightForRowAtIndexPath 被调用before我布局单元格 我只是通过在文本字符串上调用 NSString siz
  • 如何使用不同的tsconfig文件进行测试?

    在我的项目中我使用 2 个不同的 tsconfig 文件 tsconfig json tsconfig specs json 供测试用 我如何告诉 Intellij Idea 两者都使用 即在Settings Langauges Frame
  • PHP REST 下载文件

    我有一个具有这样功能的网络服务 app gt get downloadPdf function use app log example pdf res app gt response res Content Description File
  • 如何确定Apple Watch型号?

    The WKInterfaceDevice current model属性没有给出型号 对于 Apple Watch 该字符串的值为苹果手表 如何从 iOS 确定确切的 Apple Watch 型号 只是稍微更新了 Mathieu Vand
  • 在 SQL 中,如何将位掩码总计中的值拆分为逗号分隔的字符串

    我有一个位掩码值作为 int 存储在 sql 中 我想将该值转换为位掩码值中包含的值的逗号分隔列表 例如 结果可能如下所示 id name bitMaskValue values 1 Bob 5 1 4 2 Mary 13 1 4 8 3
  • 如何更改 Xamarin 表单导航页面中的背景颜色

    我正在尝试更改 navigationPage 中 navigationBar 的背景颜色我正在使用以下代码 using System using System using Xamarin Forms using System Collect
  • 要列出的 Pandas DataFrame 列[重复]

    这个问题在这里已经有答案了 我根据另一列中满足的条件从一列中提取数据子集 我可以得到正确的值 但它在 pandas core frame DataFrame 中 我如何将其转换为列表 import pandas as pd tst pd r
  • 从 android 将 JSONArray 发布到 WCF 服务

    我在将 JSONArray 值发布到我的 WCF 服务时遇到问题 当我从 Fiddler 或 Net Test Client 发布数据时 它工作正常 每次我尝试从我的 Android 应用程序发布时 我都会收到请求错误 这是我从 Andro
  • 如何在 MySQL 中正确使用 CASE..WHEN

    这是一个演示查询 注意它非常简单 仅在 base price 为 0 的情况下获取 但它仍然选择条件 3 SELECT CASE course enrollment settings base price WHEN course enrol
  • 如何在共享主机上安装 Composer?

    我有这些东西 文件http api odtu lu composer phar http api odtu lu phpinfo php FTP 访问 cPanel FreeBSD 上的 Cron 作业 PHP Perl CGI BIN P
  • Python 相当于 Ruby 的 .select

    我有一个列表 数组 我们称之为x 我想创建一个新的列表 数组 我们称之为这个z 从元素中x符合某种条件 在 Ruby 中 您可以通过调用列表 数组上的 select 方法来做到这一点 如下所示 x 1 2 3 4 5 6 7 8 9 10
  • 延迟加载单例:双重检查锁定与按需初始化持有者习惯用法

    我需要在并发环境中延迟加载资源 加载资源的代码应该只执行一次 Both 双重检查锁定 使用 JRE 5 和 volatile 关键字 和按需初始化持有者习惯用法似乎很适合这份工作 仅通过查看代码 按需初始化持有者习惯用法似乎更干净 更高效
  • Android onTouch 与 onClick 和 onLongClick

    我有一个自定义视图 其作用类似于按钮 我想在用户按下它时更改背景 当用户将手指移到外面或释放它时将背景恢复为原始状态 我还想处理 onClick onLongClick 事件 问题是 onTouch 要求我返回 trueACTION DOW