如何处理 editText 中 imageSpan 的 onClick 事件?
How to handle onClick event on imageSpan in editText?
我正在开发一个应用程序,用户可以在其中选择图库中的图像并将其添加到 editText 中,现在我希望如果用户单击 editText 中的图像它应该以全屏模式打开,我使用了以下代码:-
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 事件,
现在,我如何监听此图像上的点击事件并执行进一步的任务?
尝试
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());
在 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());
我认为使用 ClickableSpan
和 setMovementMethod
是不可接受的,因为它会导致问题。我不认为这些是用于 EditText 控件的。
另外,我需要知道用户在 span 中点击的位置。我的图像跨度在右侧有一个 X 关闭按钮,我想知道用户是否单击了 X 而不是仅单击标签。
所以我找到了另一种方法:
- 子类
ImageSpan
并覆盖 draw
方法以仅调用 super,而且还将 x/y/left/top 存储在成员变量中 - 所以,现在您知道跨度的位置在 EditText 里面。
- 子类
EditText
和句柄 onTouchEvent
只调用 super,但也获取你的跨度并点击测试每个跨度以查明用户是否点击了跨度(或跨度)。
就是这样,这个方法没有副作用。
我正在开发一个应用程序,用户可以在其中选择图库中的图像并将其添加到 editText 中,现在我希望如果用户单击 editText 中的图像它应该以全屏模式打开,我使用了以下代码:-
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 事件, 现在,我如何监听此图像上的点击事件并执行进一步的任务?
尝试
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());
在 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());
我认为使用 ClickableSpan
和 setMovementMethod
是不可接受的,因为它会导致问题。我不认为这些是用于 EditText 控件的。
另外,我需要知道用户在 span 中点击的位置。我的图像跨度在右侧有一个 X 关闭按钮,我想知道用户是否单击了 X 而不是仅单击标签。
所以我找到了另一种方法:
- 子类
ImageSpan
并覆盖draw
方法以仅调用 super,而且还将 x/y/left/top 存储在成员变量中 - 所以,现在您知道跨度的位置在 EditText 里面。 - 子类
EditText
和句柄onTouchEvent
只调用 super,但也获取你的跨度并点击测试每个跨度以查明用户是否点击了跨度(或跨度)。
就是这样,这个方法没有副作用。