android跨度点击事件

2024-04-16

好的。这些都是我的问题。

  1. 我需要使用正则表达式来过滤掉除字母之外的所有内容,然后我需要将找到的单词包含在 $word 标签中。 有了这个 str = str.replaceAll(pattern, "$0"); 。 现在我正在过滤所有正确的元素(标点符号、数字等),但它将每个单词中的每个字母封装在标签中而不是单词中。那么如何使用正则表达式将字母分组到单词中呢?

来自“(一个标签打开)t(一个关闭)(一个标签打开)h(一个关闭)(一个标签打开)i(一个关闭)(一个标签打开)s(一个关闭)(一个标签打开)i(a关闭)(一个标签打开)s(一个关闭)(一个标签打开)w(一个关闭)(一个标签打开)r(一个关闭)(一个标签打开)o(一个关闭)(一个标签打开)n(a close)(标签打开)g(关闭)";

to :

“(一个标签打开)这个(一个关闭)(一个标签打开)是(一个关闭)(一个标签打开)对(一个关闭)”;

然后我使它们可单击,我需要捕获单击事件并获取屏幕上单击的单词的位置,因为我想使用单击的事件使工具提示显示在单击的单词下方。感谢您的帮助。

公共类 MainActivity 扩展 Activity {

public String text = "This is just a sentence to test you. 23 this is another number23!g?";
public TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    text = explode(text);

    tv = (TextView) findViewById(R.id.tv1);

    tv.setLinksClickable(true);
    tv.setMovementMethod(LinkMovementMethod.getInstance());

    Spanned article = Html.fromHtml(text, null, null);
    setHTML(article);
}


public void setHTML(Spanned html) {
      SpannableString message = new SpannableString(html.toString());
      Object[] spans = html.getSpans(0, html.length(), Object.class);
      for (Object span : spans) {
         int start = html.getSpanStart(span);
         int end = html.getSpanEnd(span);
         int flags = html.getSpanFlags(span);
         if (span instanceof URLSpan) {
            URLSpan urlSpan = (URLSpan) span;
            span = new CallbackSpan(urlSpan.getURL());
         }
         message.setSpan(span, start, end, flags);
      }
      tv.setText(message);
   }
    public String explode(String str){  
      String pattern = "([a-zA-Z])";
      str = str.replaceAll(pattern, "<a href=\"$0\">$0</a>");
      return str;
    }

   private final class CallbackSpan extends ClickableSpan {

      private String m_data;
      private String url_main;

      public CallbackSpan(String url) {
         m_data = url.substring(0);
         url_main = url;

      }

      public void onClick(View view) {

          TextView item = (TextView)findViewById(R.id.tv2);
          item.setText(url_main + " was clicked.");
          Log.d("item", url_main);
      }
   }

}


最新代码,请查看链接形式 github https://github.com/boiledwater/spanned

message.setSpan(span, start, end, flags);

你需要删除原点跨度在设置新的跨度之前。 请看下面
ClickableSpan 的 onClick() 不适用于 URLSpan? https://stackoverflow.com/questions/9164190/the-onclick-of-clickablespan-is-not-working-for-urlspan

EDIT
您可以捕捉任何跨度单击事件 by extends LinkMovementMethod

    import android.os.Handler;
import android.os.Message;
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.TextView;

import java.lang.ref.WeakReference;

public class LinkMovementMethodExt extends LinkMovementMethod {
    public static final int LinkMovementMethod_Down = 1001;
    public static final int LinkMovementMethod_Up = 2002;
    private static LinkMovementMethod sInstance;
    private Class mSpanClass = null;
    private WeakReference<Handler> mWeakReference = null;

    public static MovementMethod getInstance(Handler handler, Class spanClass) {
        if (sInstance == null) {
            sInstance = new LinkMovementMethodExt();
            ((LinkMovementMethodExt) sInstance).mWeakReference = new WeakReference<>(handler);
            ((LinkMovementMethodExt) sInstance).mSpanClass = spanClass;
        }
        return sInstance;
    }

    @Override
    public boolean onTouchEvent(TextView widget, Spannable buffer,
                                MotionEvent event) {
        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP ||
                action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

            x -= widget.getTotalPaddingLeft();
            y -= widget.getTotalPaddingTop();

            x += widget.getScrollX();
            y += widget.getScrollY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);
            /**
             * get you interest span
             */
            Object[] spans = buffer.getSpans(off, off, mSpanClass);
            if (spans.length != 0) {
                if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer, buffer.getSpanStart(spans[0]), buffer.getSpanEnd(spans[0]));
                    MessageSpan obj = new MessageSpan();
                    obj.setObj(spans);
                    obj.setView(widget);
                    Handler handler = mWeakReference.get();
                    if (handler != null) {
                        Message message = handler.obtainMessage();
                        message.obj = obj;
                        message.what = LinkMovementMethod_Down;
                        message.sendToTarget();
                        return true;
                    }
                    return false;
                } else if (action == MotionEvent.ACTION_UP) {
                    Handler handler = mWeakReference.get();
                    if (handler != null) {
                        MessageSpan obj = new MessageSpan();
                        obj.setView(widget);
                        Message message = handler.obtainMessage();
                        message.obj = obj;
                        message.what = LinkMovementMethod_Up;
                        message.sendToTarget();
                        return true;
                    }
                    return false;
                }
            }
        }

        return super.onTouchEvent(widget, buffer, event);
    }

    public boolean canSelectArbitrarily() {
        return true;
    }

    public boolean onKeyUp(TextView widget, Spannable buffer, int keyCode,
                           KeyEvent event) {
        return false;
    }

textView.setMovementMethod(LinkMovementMethodExt.getInstance());


编辑“android 开发者”
这是更好的添加方式Handler财产为链接移动方法Ext class.
您可以捕获作为 Message 对象传递的所有 Spanned。

onTouchEvent 方法中的代码片段:

Message message = Handler.obtainMessage();
message.obj = buffer.getSpans(off, off, Spanned.class);//get all spanned
message.what = 111;//which value ,it is up to you
message.sendToTarget(); //send message to you target handler

您可以在处理程序类中处理预期的跨越。也许这是一种灵活的处理方式。
希望对您有所帮助。



上面的文本视图文本是<a href='/a'>aaaa</a>123456<a href='/b'>bbbb</b>7890
我了解您的要求:
点击“aaaa”,你想要它s href value '/a', click 'bbbb',get its href '/b';不触发在网络浏览器中打开的默认操作。
如果我的理解是正确的,你可以这样做:

  • 为textview等设置LinkMovementMethod:textview.setMovementMethod(LinkMovementMethodExt.getInstance(handler, URLSpan.class));
  • 获取兴趣跨度,这里是URLSpan。
    在你的处理程序中处理消息方法,你可以这样做:
private Handler handler = new Handler() {
      public void handleMessage(Message msg) {
          int what = msg.what;
          if (what == 100) {
              Object[] spans = (Object[])msg.obj;
              for (Object span : spans) {
                  if (span instanceof URLSpan) {
                      System.out.println(((URLSpan) span).getURL());
                  }
              }
          }
      };
  };

下载演示代码 https://github.com/boiledwater/spanned

  • 主要活动 has color您可以根据需要指定颜色值的属性。

怎么做?

  • Step1,获取当前点击跨度。

  • Step2、设置BackgroundColorSpan为当前点击跨度

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

android跨度点击事件 的相关文章

  • Android 无法查找支持版本 27.0.0 的窗口

    更新后supportVersion to 27 0 0仅在 Android 5 0 2 上 应用程序会因以下堆栈跟踪而崩溃 W WindowManager Failed looking up window java lang Illegal
  • 我从 String placeName = placeText.getText().toString(); 收到空指针异常

    您好 想从编辑文本中获取地名并在地图上标记 这是我的代码 其中出现空指针异常 请帮助我应该做什么以及哪里出错了 因为我从对话框中的编辑文本字段获取地名 View layout View inflate this R layout alert
  • 片段开始时显示用于编辑文本的键盘

    当我的片段开始时 我希望我的编辑文本成为焦点 让用户开始输入内容 我可以使用 requestFocus 将其聚焦 但无法显示键盘 我已经尝试过这两种方法 edit EditText view findViewById R id search
  • 实施材质主题时遇到问题

    我在用this http antonioleiva com material design everywhere 作为在 Android 5 0 之前的设备上向现有应用程序实施 Material 主题的教程 我的问题是我得到了Null Po
  • TabHost 中的 Webview = 以黑屏启动

    我正在尝试在有 4 个选项卡的 tabhost 中使用 webview 所有选项卡都链接到同一个 webview 这很好 除了一个问题 启动时 网络视图是黑色的 单击选项卡 2 3 或 4 使其 活跃起来 我的快速解决方法是使用 setCu
  • 从 JSON 数组创建标记 php mySQL Google Maps v2 android

    我正在尝试从 mySQL 数据库在 Google Maps v2 上创建标记 但它不起作用 地图确实出现了 但没有标记 谁能告诉我出了什么问题以及我需要改变什么 我也尝试过让 getDouble 为 getDouble 0 和 getDou
  • 带圆角边框的 Div

    我不明白获得 div 的更大圆角底部边框的公式 以及是否有更简单的方法在 Bootstrap 中实现它 现在是这样的 以及我想如何开发它 header background color blue height 40px width 90px
  • 直接在应用程序中评价 Google Play 应用程序 [重复]

    这个问题在这里已经有答案了 我需要在我的 Android 应用程序中设置费率选项 我找到了这个link http www androidsnippets com prompt engaged users to rate your app i
  • 如何从MediaCodec获取解码格式?

    我正在与MediaCodec 我用它来解码 mp4 video MediaCodec 将视频解码为YUV格式 但我需要得到RGBA 一切都很好 但我发现有几种可能的格式 例如YUV420 YUV422等等 因此 据我所知 要进行转换 我需要
  • Android 4.2以下如何设置layoutDirection为RTL

    尝试将布局元素设置为 RTL 顺序 4 2 及以上行 layoutDirection rtl 并在清单中 android supportsRtl true 工作得很好 但对于 4 2 以下则不然 解决方案有人吗 只需使用视图兼容使用 and
  • 是否可以用 C# 为 Android 编写应用程序?

    我们都知道Android运行Dalvik VM程序 通常开发人员用 Java 编写程序并将其编译为 Dalvik 字节码 我想知道是否有可能创建一个可以接受 C 代码并将其编译为 Dalvik 字节码的编译器 嗯 这是一种选择 或者您可以在
  • 无法获取 android.permission.CLEAR_APP_USER_DATA

    我正在开发需要特殊权限的系统应用程序 由于某种原因 我无法获得 CLEAR APP USER DATA 权限 但我可以使用 INSTALL PACKAGES DELETE PACKAGES 等 什么可能导致这种情况 显现 uses perm
  • Android 上的 Facebook 深度链接

    我正在尝试在我的应用程序上实现 Facebook 的深度链接功能 并遇到了以下情况 我有一个名为 MainActivity 的活动 其声明如下
  • Android - 按下后退按钮时停止 AsyncTask 并返回到上一个 Activity

    我有一个 AsyncTask 我希望它在按下后退按钮时停止执行 我还希望应用程序返回到之前显示的 Activity 看来我已经成功停止了任务 但应用程序没有返回到之前的活动 有任何想法吗 这是我的代码的摘录 private class My
  • 使用 css resize:both 调整表格单元格的大小;不使用表

    使用 css resize both 调整表格单元格大小不适用于表格 我需要调整表格及其单元格的大小 可以使用 css 调整大小 css resize both 在 div 中有效 但在表标签中无效 table border 1 tr td
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • 与 body 相比,将 css 规则应用于 html 有什么区别?

    我看不出以下之间的区别 html background f1f1f1 and body background f1f1f1 有什么解释吗 没有真正的区别 如果你只是谈论在哪里申请background 否则BoltClock 对另一个问题的回
  • 属性更改时的 jQuery 事件

    我需要一个函数在 divs data page index 属性更改时运行 var active swipeview active dpi parseInt active attr data page index left data pag
  • HTML 嵌入对象具有灰色背景。可以透明吗?

    我使用带有开源插件的 Firefox 来播放视频 视频被 尽可能好地 缩放以适应嵌入对象的宽度和高度中定义的可用空间 但有时右侧和 或底部会有一点灰色边框 看来这不是我的父 div 的背景颜色 因为更改它根本没有效果 这是 HTML div
  • 安装 APK 时出现会话“应用程序”错误

    我在将 Android Studio 1 1 编写的项目导入 Android Studio 2 1 2 时遇到困难 每当在平板电脑上测试应用程序之前构建 gradle 时 我都会收到此错误 下面是错误的屏幕截图 有谁知道是什么问题 我尝试过

随机推荐

  • Laravel/Symfony:无法加载“app”配置文件

    升级我的家园并安装我的软件包后 我遇到了一个奇怪的错误 通话中php artisan输出如下 In LoadConfiguration php line 68 Unable to load the app configuration fil
  • opencv边界框问题

    我有一个图像需要在周围绘制一个边界框 我正在尝试使用本文底部的代码 我遇到的问题是我尝试模糊蓝色框形状以删除其细节 例如 cv2 blur img 20 20 但模糊图像似乎没有足够好的边缘来生成边界框 我发现 如果我将下面的代码与具有与下
  • Spring Java 应用程序找不到密钥库文件

    我正在尝试设置一个简单的 Spring 应用程序来使用 SSL 并将其托管在 Digital Ocean 上 为什么我的应用程序找不到密钥库文件 我设置的 Droplet 基于 Ubuntu 18 04 我使用 Letscrypt 来获取证
  • WCF net.tcp 传输安全 - 如何在客户端上禁用服务器证书验证

    我正在使用 WCF 进行一些测试 目前我们有以下服务器设置 简化的配置
  • 在 MSBuild 中将字符串构建为基本字符串 n 次的串联

    我在 MSBuild 的属性中有一个数字 n 我还有一个字符串 Str 需要重复 n 次才能获得最终字符串 即重复 Str n 次 例如 如果n为3 Str为 abc 我想要获取的是 abcabcabc 由于无法在 MSBuild 中循环
  • 如何在 Windows 上为 ruby​​ 安装 PCAP

    这肯定是一个相对较新的问题 但我仍然陷入困境 我知道有一个简单的解决方案 我已经进行了一些谷歌搜索 但找不到确切的答案 这是我得到的错误 C Ruby193 include ruby 1 9 1 i386 mingw32 gt gem in
  • 将一个 div 置于另一个 div 之上

    我向我的网络应用程序添加了一个登陆页面 因此当它从服务器加载数据时 登陆页面会显示加载图像和描述 div class map view div class loading screen img src img loading boys gi
  • 在 Web.Config 文件外部存储 SMTP

    一段时间以来 我一直将连接和应用程序设置存储在外部文件中 并仅通过 web config 引用该文件 这非常有效 因为它允许我保留单独的连接字符串和应用程序设置 这真的很方便 因为我发现在开发过程中我经常会对 webconfig 进行许多更
  • CreateRemoteThread 32->64 和/或 64->32

    我需要一种在 x64 窗口中 CreateRemoteThread 到 64 和 32 位进程的方法 我已经弄清楚了如何找到目标进程的指令集 如何在目标进程中为汇编雪橇分配内存 并且我几乎已经弄清楚如何处理地址空间随机化 当远程进程的指令集
  • 为什么我的原型函数不返回实例的属性?

    我有一个简单的 JavaScript 对象 函数 myClass x y this x x this y y 和一个原型函数 myClass prototype myfunction function console log this x
  • X.509 证书的 Java 1.7 主题哈希 OpenSSL 1.0+ 兼容

    我已经为此苦苦挣扎了几天 我正在开发一个在嵌入式 Linux 环境中运行的 Java 1 7 应用程序 OpenSSL 不可用 我无法控制设备上操作系统映像中的内容 我需要计算自签名 X 509 证书的主题哈希 生成与 OpenSSL 1
  • MutationRecord.addedNodes 节点列表中返回的节点数(mutationObserver)

    MutationRecord addedNodes 返回 NodeList 其中检测到在我的文档中添加了节点 当我使用 obj appendChild 方法时 mutationObserver 会检测到它并将 MutationRecord
  • Android GCM:了解 XMPP

    我正在尝试使用应用程序在我的 GCM 中实现 XMPP 协议 但即使经过广泛搜索 我也不理解其背后的概念 另外 也许我并不真的需要 XMPP 来完成我想用我的应用程序做的事情 但我喜欢学习东西 让我们以 HTTP 为例 我的应用程序将 he
  • 如何使用 Android xml 形状在圆内画圆?

    我正在尝试为我的应用程序制作一个搜索栏的拇指 并且我希望有一个内圆被另一个更大 半透明 的外圆包围 我正在尝试使用layer list 但我遇到了问题 下面是我的代码
  • Java 自动类型提升

    我引用 Herbert Schildt 的话 JAVA 完整参考第 8 版 第4章 操作员 当您转移时 Java 自动类型提升会产生意想不到的结果byte and short价值观 如你所知 byte and short价值观被提升为int
  • 使用 NumPy 索引数组对 Python 列表进行切片——有什么快速方法吗?

    我有一个常规的list called a 以及一个 NumPy 索引数组b 不 我不可能转换a到 NumPy 数组 有什么方法可以达到与 相同的效果 a b 有效 需要明确的是 这意味着我不想提取每个人int in b由于其性能影响 是的
  • 如何重置测试之间导入的模块

    假设我有一个模块需要在应用程序启动时初始化一次 以传递配置 模块看起来像这样 MyModule js let isInitiazlied const myModule init function isInitiazlied true do
  • 张量流学习中的多元回归输出节点

    我对张量流比较陌生 想使用 tf contrib learn 中的 DNNRegressor 来执行回归任务 但我不想有一个输出节点 而是想要多个 例如十个 如何配置回归器来调整许多输出节点以满足我的需求 我的问题与以下已在 SO 上提出的
  • 如何查看亚马逊 lambda 函数的 console.log 输出

    当你做一个 console log Loading function 在亚马逊 lambda 函数中 它去哪里了 我的设置 API网关 lambda函数nodejs6 10 卷曲https n2tredacted execute api u
  • android跨度点击事件

    好的 这些都是我的问题 我需要使用正则表达式来过滤掉除字母之外的所有内容 然后我需要将找到的单词包含在 word 标签中 有了这个 str str replaceAll pattern 0 现在我正在过滤所有正确的元素 标点符号 数字等 但