Android的跨click事件 [英] android span click event

查看:212
本文介绍了Android的跨click事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

确定。这是我的问题。

  1. 我需要用户经常EX pressions到菲力了一切,除了信件,然后我需要在一个$字标签包住找到的单词。 有了这个海峡= str.replaceAll(图案,$ 0); 现在我过滤了所有正确的元素(标点符号,数字等),但其包围每个字中的每一个字母的一个标签不字。所以我怎么使用常规EX pression组中的字母词?

这是(标签打开)T(亲密)(标签打开)H(亲密)(开放标签)我(紧密)(一个开放的标签)S(亲密)(一个开放的标签)我(亲密)(开放标签)S(亲密)(标签打开)W(亲密)(标签打开)R(亲密)(标签打开)O(亲密)(标签打开) N(亲密)(标签打开)G(亲密);

(标签打开)本(亲密)(标签打开)是(密切)(标签打开)右(亲密);

然后我让他们可以点击的,我需要赶上click事件,并获得了点击的文字在屏幕上的位置,因为我想用点击事件,使工具提示显示下方点击的字。感谢您的帮助。

公共类MainActivity延伸活动{

 公共字符串文本=这只是一个句子来测试你23,这是另一个number23克!?;
公众的TextView电视;

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);

    的setContentView(R.layout.activity_main);

    文=爆炸(文本);

    电视=(TextView中)findViewById(R.id.tv1);

    tv.setLinksClickable(真正的);
    tv.setMovementMethod(LinkMovementMethod.getInstance());

    跨区文章= Html.fromHtml(文字,NULL,NULL);
    setHTML(条);
}


公共无效setHTML(跨区HTML){
      SpannableString消息=新SpannableString(html.toString());
      [对象]跨度= html.getSpans(0,html.length(),Object.class);
      对于(对象跨度:跨度){
         INT开始= html.getSpanStart(跨度);
         INT端= html.getSpanEnd(跨度);
         INT标志= html.getSpanFlags(跨度);
         如果(跨度的instanceof URLSpan){
            URLSpan urlSpan =(URLSpan)跨度;
            跨度=新CallbackSpan(urlSpan.getURL());
         }
         message.setSpan(跨度,开始,结束,旗);
      }
      tv.setText(消息);
   }
    公共字符串爆炸(字符串str){
      字符串模式=([A-ZA-Z]);
      海峡= str.replaceAll(图案,&所述; A HREF = \$ 0 \> $ 0℃; / A>中);
      返回海峡;
    }

   私人final类CallbackSpan扩展ClickableSpan {

      私人字符串M_DATA;
      私人字符串url_main;

      公共CallbackSpan(字符串URL){
         M_DATA = url.substring(0);
         url_main =网址;

      }

      公共无效的onClick(视图查看){

          TextView的项目=(TextView中)findViewById(R.id.tv2);
          item.setText(url_main +被点击了。);
          Log.d(项目,url_main);
      }
   }
 

}

解决方案

  message.setSpan(跨度,开始,结束,旗);
 

您需要删除产地范围之前设置新跨越。 请参阅下面
<一href="http://stackoverflow.com/questions/9164190/the-onclick-of-clickablespan-is-not-working-for-urlspan">The ClickableSpan的的onClick()不工作URLSpan?

编辑
您可以捕获任何跨度click事件扩展LinkMovementMethod

 进口android.text.Layout;
进口android.text.Spannable;
进口android.text.method.LinkMovementMethod;
进口android.text.method.MovementMethod;
进口android.text.style.ImageSpan;
进口android.view.MotionEvent;
进口android.widget.TextView;

公共类LinkMovementMethodExt扩展LinkMovementMethod {
    私有静态LinkMovementMethod sInstance;
    私人处理程序处理程序= NULL;
    私有类spanClass = NULL;
    公共静态MovementMethod的getInstance(处理器_handler,类_spanClass){
        如果(sInstance == NULL){
            sInstance =新LinkMovementMethodExt();
                    ((LinkMovementMethodExt)sInstance).handler = _handler;
                    ((LinkMovementMethodExt)sInstance).spanClass = _spanClass;
                    }
        返回sInstance;
    }
     @覆盖
        公共布尔的onTouchEvent(TextView的小部件,Spannable缓冲,
                                    MotionEvent事件){
            INT行动= event.getAction();

            如果(行动== MotionEvent.ACTION_UP ||
                行动== MotionEvent.ACTION_DOWN){
                INT X =(int)的event.getX();
                INT Y =(INT)event.getY();

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

                X + = widget.getScrollX();
                Y + = widget.getScrollY();

                布局布局= widget.getLayout();
                INT线= layout.getLineForVertical(Y);
                诠释关闭= layout.getOffsetForHorizo​​ntal(线,X);
                / **
             *让你的兴趣范围,在这里得到ImageSpan您点击
             * /
                [对象]跨度= buffer.getSpans(脱,脱,spanClass);
            如果(spans.length!= 0){
                如果(动作== MotionEvent.ACTION_UP){
                    消息消息= handler.obtainMessage();
                            message.obj =跨度;
                            message.what = 100;
                            message.sendToTarget();
                    返回true;
                }
            }
            }

            返回super.onTouchEvent(窗口小部件,缓冲,事件);
        }

}
 

textView.setMovementMethod(LinkMovementMethodExt.getInstance());


修改为Android开发
这是更好的方式来增加处理程序属性 LinkMovementMethodExt 类。
您可以捕捉这些交付的信息对象的所有跨区。

剪断code中的onTouchEvent方法:

 消息消息= Handler.obtainMessage();
message.obj = buffer.getSpans(脱,脱,Spanned.class); //获取所有跨越
message.what = 111; //它的价值,它是由你
message.sendToTarget(); //发送消息给你的目标处理程序
 

您可以处理跨越预计在你处理程序类。可能是灵活的方式来处理。
希望能帮助你。



以上的TextView文本&LT; A HREF ='/ A'&GT; AAAA&LT; / A&GT; 123456&LT; A HREF ='/ B'&GT; BBBB&LT; / B&GT; 7890
我理解你的要求:
点击'AAAA',你想要得到它取值href的值'/ A',点击'BBBB,把它取值HREF/ B';不触发这是在网页浏览器中打开默认的动作。
如果我的理解是正确的,你可以这样做:

  • 设置LinkMovementMethod的TextView的,等等: textview.setMovementMethod(LinkMovementMethodExt.getInstance(处理器,URLSpan.class));
  • 在获取利益范围,这里是URLSpan。
    在你处理的的handleMessage 方式,你可以这样做:

 专用处理器处理器=新的处理程序(){
      公共无效的handleMessage(信息MSG){
          诠释了什么= msg.what;
          如果(什么== 100){
              [对象]跨度=(对象[])msg.obj;
              对于(对象跨度:跨度){
                  如果(跨度的instanceof URLSpan){
                      的System.out.println(((URLSpan)跨度).getURL());
                  }
              }
          }
      };
  };
 


下载演示code

  • MainActivity 颜色属性,只要你喜欢,你可以指定哪些颜色值。

怎么办?

  • 第一步,得到当前点击跨度。

  • 第二步,设置BackgroundColorSpan为当前点击跨度

Ok. These are my problems.

  1. I need to user regular expressions to filet out everything except for letters and then I need to encase the found words within a $word tag. With this str = str.replaceAll(pattern, "$0");. right now I am filtering all of the right elements (punctuation, numbers etc) but its encasing every letter within each word in an a tag not the word. so how do I use the regular expression to group the letters to a word?

from "(a tag open)t(a close)(a tag open)h(a close)(a tag open)i(a close)(a tag open)s(a close) (a tag open)i(a close)(a tag open)s(a close) (a tag open)w(a close)(a tag open)r(a close)(a tag open)o(a close)(a tag open)n(a close)(a tag open)g(a close)";

to :

"(a tag open)This(a close) (a tag open)is(a close) (a tag open)right(a close)";

then I'm making them clickable and I need to catch the click event and get the position on screen on the clicked word as I want to use the clicked event to make a tool tip show up just below the clicked word. thank you for your help.

public class MainActivity extends 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);
      }
   }

}

解决方案

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

You need remove origin span before set new span. Please see below
The onClick() of ClickableSpan is not working for URLSpan?

EDIT
You can capture any span click event by extends LinkMovementMethod

import android.text.Layout;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.text.style.ImageSpan;
import android.view.MotionEvent;
import android.widget.TextView;

public class LinkMovementMethodExt extends LinkMovementMethod {
    private static LinkMovementMethod sInstance;
    private Handler handler = null;
    private  Class spanClass = null;
    public static MovementMethod getInstance(Handler _handler,Class _spanClass) {
        if (sInstance == null){
            sInstance = new LinkMovementMethodExt();
                    ((LinkMovementMethodExt)sInstance).handler = _handler;
                    ((LinkMovementMethodExt)sInstance).spanClass = _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, here get ImageSpan that you click
             */
                Object [] spans = buffer.getSpans(off, off, spanClass);
            if (spans.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    Message message = handler.obtainMessage();
                            message.obj = spans;
                            message.what = 100;
                            message.sendToTarget();
                    return true;
                } 
            }
            }

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

}

textView.setMovementMethod(LinkMovementMethodExt.getInstance());


Edit for "android developer"
It is better way to add Handler property for LinkMovementMethodExt class.
You can capture all Spanned which are delivered as Message object.

Snip code in onTouchEvent method:

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

You can handler expected spanned in you handler class. May be it is flexible way to handle .
Hope to help you.



Above textview text is <a href='/a'>aaaa</a>123456<a href='/b'>bbbb</b>7890
I understand you requirement :
Click 'aaaa',you want get its href value '/a', click 'bbbb',get its href '/b'; Do not trigger default action which is opened in web browser.
If my understand is right, you can do like this:

  • Set LinkMovementMethod for textview, etc:textview.setMovementMethod(LinkMovementMethodExt.getInstance(handler, URLSpan.class));
  • Get interest span, here is URLSpan.
    In you handler handleMessage method, you can do like this:

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());
                  }
              }
          }
      };
  };


Download demo code

  • MainActivity has color property which you can assign which color value as you like.

How to do?

  • Step1, get current click span.

  • Step2, set BackgroundColorSpan for current click span

这篇关于Android的跨click事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆