问题
i am working on an app in which user choose an image from gallery and it will be added in editText, now i want if user click on image in editText it should open in fullScreen, i used below code :-
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);
}
tried above code but its not listening onClick event, now, how can i listen click event on this image and do further task?
回答1:
Clickable Span at the same start and end locations of the editText.
sb.setSpan(cs, imageStartSpan,imageEndSpan , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Also
editText.setMovementMethod(LinkMovementMethod.getInstance());
I cannot write the whole code for you. Try the below sample:-
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());
回答2:
I did not find using ClickableSpan
and setMovementMethod
to be acceptable given the problems it causes. I do not believe these were intended to be used in EditText control.
Also, I need to know WHERE the user clicked in the span. My image span has an X close button at the right side and I want to know if the user clicked on the X as opposed to just clicking on the label.
So I found another way:
- Subclass
ImageSpan
and override thedraw
method to just call the super, but also to store the x/y/left/top in member variables - so, now you know where the span is positioned inside the EditText. - Subclass
EditText
and handleonTouchEvent
to just call the super, but also get your spans and hit test each one to find out if the user tapped on the span (or a part of the span).
That's it, this method works with no side effects.
回答3:
Try
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);
Also add this:
yourEditText.setMovementMethod(LinkMovementMethod.getInstance());
来源:https://stackoverflow.com/questions/32040166/how-to-handle-onclick-event-on-imagespan-in-edittext