android span click event

前端 未结 2 891
萌比男神i
萌比男神i 2020-12-01 23:09

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 $w
相关标签:
2条回答
  • 2020-12-01 23:48

    Assuming You want click individual words on the textview?. I din't understand the converts all letters to words in your comment.

    The below can be used to click on individual works and it is displayed in a 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
         }
        }
        }
    
    0 讨论(0)
  • 2020-12-01 23:53

    Latest code ,pls see link form github

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


    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.


    enter image description here


    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

    0 讨论(0)
提交回复
热议问题