2015-08-16 5 views
7

Я работаю над приложением, в котором пользователь может выбрать изображение из галереи, и она будет добавлена ​​в EditText, теперь я хочу, если пользователь нажимает на изображение в EditText он должен открыть в полноэкранном режиме, я использовал код ниже: -Как обрабатывать событие onClick на imageSpan в 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 на этом изображении и выполнить дальнейшую задачу?

ответ

7

кликабельны Промежуток при тех же начальных и конечных местоположений 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()); 
+1

Я попробовал setMovementMethod, но его не работает, пожалуйста, объясните подробно, где я должен измениться в своем ВЫШЕ code (addtoEdt (Bitmap bitmap)) –

+1

ImageSpan span = new ImageSpan (d, ImageSpan.ALIGN_BASELINE); ss.setSpan (диапазон, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); Аналогичным образом добавьте clickablespan к тому же самому месту начала и конца -> 0,3. – Rahul

+1

жаль, что я не получу, вы можете отредактировать мой код и опубликовать в качестве ответа, если его работа я приму на ваш ответ :) –

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()); 
+1

Спасибо, просто попробовать свой код, то даст вам обратную связь :) –

+1

не работает, огонь тост OnClick, но не слушать нажмите событие :( –

+0

@Nishusharma Посмотрите еще раз, пожалуйста. Добавьте последнюю строку –

1

я не нашел с помощью ClickableSpan и setMovementMethod быть приемлемым, учитывая проблемы, которые она вызывает. Я не думаю, что они предназначались для использования в элементе управления EditText.

Кроме того, мне нужно знать, ГДЕ пользователь щелкнул в промежутке. В моем пространстве изображения есть кнопка закрытия X с правой стороны, и я хочу знать, нажал ли пользователь на X, а не просто нажимать на метку.

Так что я нашел еще один способ:

  • Подкласс ImageSpan и переопределить метод draw просто назвать супер, но и для хранения X/Y/левый/верх в переменных-членов - так, теперь вы знаете, где интервал помещается внутри EditText.
  • Подкласс EditText и ручка onTouchEvent, чтобы просто вызвать супер, но также получить ваши пролеты и проверить каждый из них, чтобы узнать, использовал ли пользователь пролет (или часть пролета).

Все, этот метод работает без побочных эффектов.