12

我正在开发一个应用程序,用户从图库中选择图像并将其添加到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 事件,现在,我怎样才能在这个图像上监听 click 事件并做进一步的任务?

4

3 回答 3

15

在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());
于 2015-08-18T04:57:51.660 回答
5

考虑到它引起的问题,我没有发现使用ClickableSpan并且可以接受。setMovementMethod我不相信这些是打算在 EditText 控件中使用的。

另外,我需要知道用户在跨度中单击的位置。我的图像跨度在右侧有一个 X 关闭按钮,我想知道用户是否单击了 X 而不是仅单击标签。

于是我找到了另一种方法:

  • 子类ImageSpan化并重写该draw方法以仅调用 super,但还将 x/y/left/top 存储在成员变量中 - 所以,现在您知道跨度在 EditText 中的位置。
  • 子类EditText和句柄onTouchEvent仅调用超级,但也获取您的跨度并点击测试每个以了解用户是否点击了跨度(或跨度的一部分)。

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

于 2016-12-28T23:46:05.127 回答
1

尝试

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());
于 2015-08-16T21:49:37.333 回答