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跨度点击事件 的相关文章