如何在editText中处理imageSpan上的onClick事件?

我正在一个应用程序中,用户从画廊中select一个图像,它将被添加到editText,现在我想如果用户点击editText中的图像,它应该在fullScreen中打开,我使用下面的代码:

public void addToEdt(Bitmap bitmap){ SpannableString ss = new SpannableString("abc"); Drawable d = new BitmapDrawable(getResources(), bitmap); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); ss.setSpan(span, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); edt_note.setTransformationMethod(null); edt_note.getText().insert(edt_note.getSelectionStart(), ss); final int start = ss.getSpanStart(span); final int end = ss.getSpanEnd(span); ClickableSpan click_span = new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getApplicationContext(),"Clicked",Toast.LENGTH_LONG).show(); } }; ClickableSpan[] click_spans = ss.getSpans(start, end, ClickableSpan.class); if(click_spans.length != 0) { // remove all click spans for (ClickableSpan c_span : click_spans) { ss.removeSpan(c_span); } } ss.setSpan(click_span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } 

尝试上面的代码,但它不听onClick事件,现在,我怎么能听这个图像上的点击事件,并进一步的任务?

Related of "如何在editText中处理imageSpan上的onClick事件?"

可编辑的跨度在editText的相同的开始和结束位置。

 sb.setSpan(cs, imageStartSpan,imageEndSpan , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

 editText.setMovementMethod(LinkMovementMethod.getInstance()); 

我不能为你写整个代码。 试试下面的例子:

 public void addToEdt(Bitmap bitmap){ SpannableString ss = new SpannableString(); Drawable d = new BitmapDrawable(getResources(), bitmap); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); ss.append("abc"); // Append the text here ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); ss.setSpan(span, 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // start(0) and end (2) will create an image span over abc text ss.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { ss.delete(0, 2); editText.setText(ss); } },0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // this will add a clickable span and on click will delete the span and text editText.setText(ss); // this will show your image/clickable span in edittext } editText.setMovementMethod(LinkMovementMethod.getInstance()); 

尝试

 final int start = ss.getSpanStart(span); final int end = ss.getSpanEnd(span); ClickableSpan click_span = new ClickableSpan() { @Override public void onClick(View widget) { } }; ClickableSpan[] click_spans = ss.getSpans(start, end, ClickableSpan.class); if(click_spans.length != 0) { // remove all click spans for (ClickableSpan c_span : click_spans) { ss.removeSpan(c_span); } } ss.setSpan(click_span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

另外添加这个:

 yourEditText.setMovementMethod(LinkMovementMethod.getInstance()); 

我没有发现使用ClickableSpansetMovementMethod是可以接受的,因为它引起的问题。 我不相信这些打算在EditText控件中使用。

另外,我需要知道用户点击的跨度。 我的图像跨度在右侧有一个Xclosuresbutton,我想知道用户是否点击了X而不是点击标签。

所以我find了另一种方式:

  • 子类ImageSpan并重写draw方法来调用super,还可以将x / y / left / top存储在成员variables中 – 所以,现在您知道跨度在EditText中的位置了。
  • 子类EditText和处理onTouchEvent只是调用超级,但也得到你的跨度和命中每一个testing,以确定用户是否在跨度(或部分跨度)上轻敲。

就是这样,这个方法没有副作用。