Android 安卓span点击事件

Android 安卓span点击事件,android,position,tooltip,html,clickable,Android,Position,Tooltip,Html,Clickable,嗯。这些是我的问题 我需要使用正则表达式将除字母以外的所有内容归档,然后我需要将找到的单词封装在$word标记中。 使用此str=str.replaceAll(模式“$0”);。 现在我正在过滤所有正确的元素(标点符号、数字等),但它将每个单词中的每个字母都封装在一个a标记中,而不是单词。那么如何使用正则表达式将字母分组到一个单词中呢 从(标签打开)t(关闭)(标签打开)h(关闭)(标签打开)i(关闭)(标签打开)s(关闭)(标签打开)i(关闭)(标签打开)s(关闭)(标签打开)w(关闭)(标签

嗯。这些是我的问题

  • 我需要使用正则表达式将除字母以外的所有内容归档,然后我需要将找到的单词封装在$word标记中。 使用此str=str.replaceAll(模式“$0”);。 现在我正在过滤所有正确的元素(标点符号、数字等),但它将每个单词中的每个字母都封装在一个a标记中,而不是单词。那么如何使用正则表达式将字母分组到一个单词中呢
  • 从(标签打开)t(关闭)(标签打开)h(关闭)(标签打开)i(关闭)(标签打开)s(关闭)(标签打开)i(关闭)(标签打开)s(关闭)(标签打开)w(关闭)(标签打开)r(关闭)(标签打开)o(关闭)(标签打开)n(关闭)(标签打开)g(关闭)

    致:

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

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

    公共类MainActivity扩展了活动{

    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);
          }
       }
    
    publicstringtext=“这只是一个测试你的句子。23这是另一个数字23!g?”;
    公共图文电视;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    文本=分解(文本);
    tv=(TextView)findviewbyd(R.id.tv1);
    tv.setLinksClickable(true);
    setMovementMethod(LinkMovementMethod.getInstance());
    span article=Html.fromHtml(text,null,null);
    setHTML(文章);
    }
    公共void setHTML(跨html){
    SpannableString message=新的SpannableString(html.toString());
    Object[]span=html.getspan(0,html.length(),Object.class);
    用于(对象跨度:跨度){
    int start=html.getSpanStart(span);
    int end=html.getSpanEnd(span);
    int flags=html.getSpanFlags(span);
    if(URLSpan的span实例){
    URLSpan URLSpan=(URLSpan)span;
    span=newcallbackspan(urlSpan.getURL());
    }
    message.setSpan(范围、开始、结束、标志);
    }
    tv.setText(消息);
    }
    公共字符串分解(字符串str){
    字符串模式=“([a-zA-Z])”;
    str=str.replaceAll(模式“”);
    返回str;
    }
    私有final类CallbackSpan扩展了ClickableSpan{
    私有字符串m_数据;
    私有字符串url_main;
    公共CallbackSpan(字符串url){
    m_data=url.substring(0);
    url_main=url;
    }
    公共void onClick(视图){
    TextView项=(TextView)findViewById(R.id.tv2);
    item.setText(url_main+“已单击”);
    Log.d(“项目”,url\u main);
    }
    }
    

    }

    假设您想要单击文本视图?上的单个单词?。我不明白你评论中所有的字母都转换成了单词

    以下内容可用于单击单个作品,并以toast的形式显示

        public class MainActivity extends Activity {
    
        TextView _tv;
        String[] each;
        SpannableString ss1;
        Button b;
        EditText et;
        String s;
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b= (Button) findViewById(R.id.button1);
        et = (EditText) findViewById(R.id.ed);
        _tv = (TextView) findViewById( R.id.tv );
        b.setOnClickListener(new OnClickListener()
        {
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            s=et.getText().toString();
            _tv.setText("");
            for(int i=0;i<s.length();i++)
            {
                each = s.split("\\s+");
            }
            for(int i=0;i<each.length;i++)
            {
                System.out.println("................"+each[i]);
                ss1=  new SpannableString(each[i]);
                //StyleSpan boldSpan = new StyleSpan( Typeface.BOLD );
                //spannable.setSpan( boldSpan, 41, 52, Spannable.SPAN_INCLUSIVE_INCLUSIVE );
                ss1.setSpan(new MyClickableSpan(each[i]), 0, ss1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                _tv.append(ss1); 
                _tv.append(" "); 
    
            }
            _tv.setMovementMethod(LinkMovementMethod.getInstance());
        }
           });
          }
          class MyClickableSpan extends ClickableSpan{ 
          String clicked;
              public MyClickableSpan(String string) {
        // TODO Auto-generated constructor stub
           clicked =string;
          }
          //clickable span
          public void onClick(View textView) {
          //do something
    
    
          Toast.makeText(MainActivity.this,clicked ,
            Toast.LENGTH_SHORT).show();
         }
         @Override
         public void updateDrawState(TextPaint ds) {
         ds.setColor(Color.BLACK);//set text color 
         ds.setUnderlineText(false); // set to false to remove underline
         }
        }
        }
    
    公共类MainActivity扩展活动{
    图文电视;
    字符串[]每个;
    展弦ss1;
    按钮b;
    编辑文本;
    字符串s;
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b=(按钮)findViewById(R.id.button1);
    et=(编辑文本)findViewById(R.id.ed);
    _tv=(TextView)findviewbyd(R.id.tv);
    b、 setOnClickListener(新的OnClickListener()
    {
    @凌驾
    公共void onClick(视图v){
    //TODO自动生成的方法存根
    s=et.getText().toString();
    _tv.setText(“”);
    有关(int i=0;i最新代码,请参见
    

    在设置新跨距之前,需要删除原点跨距。 请参见下文

    编辑
    通过
    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;
        }
    
    您可以在处理程序类中使用预期的处理程序。这可能是一种灵活的处理方式。
    希望能帮助你



    上面的文本视图文本是
    123456
    

    • MainActivity具有color属性,您可以根据需要指定颜色值
    怎么办

    • 步骤1,获取当前单击范围

    • 步骤2,为当前单击范围设置BackgroundColorSpan


    我不能清楚地理解这个问题。你有字符串,你想点击文本视图中的文本。首先我有字符串“这是一个带有数字238 66和?PUNC BL BLA”我想把它转换成“这是一个带有数字238 66和?PUNC BL BLA”但我得到的是“这是…”那么,我如何将字母分组到您想要的单词中,使单个工作在textview中可单击?是的,但我已经用上面的代码实现了。我可以记录每个不同的单词以及每个单击项目所需的所有详细信息,但它不会转换所有字母words@TheMan68这就是你一直在寻找的吗?不完全是因为这仍然带来了妈妈kes所有元素,如数字和可点击的内容。我只对单词进行了注释。这就是为什么我使用正则表达式在单词周围插入a标记。感谢您的帮助这是一个非常好的解决方案。我可以在单击链接时进行自定义操作,但在链接上仍然具有相同的单击效果吗(我改用ClickableSpan)?我不明白。也许我会解释得更好一些:假设我有一个textView,我从strings.xml中设置了一个文本,它里面有多个链接。我希望捕获每个链接上的点击,这样我就可以自己处理接下来发生的事情,而不是打开web浏览器的意图。我该怎么做?你将把手柄放在哪里并使其超过默认行为?目前我所能看到的只是准备hanlder,但没有连接到放置它并使其工作的位置…我有edit MovementMethod getInstance()方法wh
        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;
        }
    
    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
    
    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());
                      }
                  }
              }
          };
      };