2015-08-16 11 views
7

Sto lavorando su un app in cui all'utente di scegliere un'immagine dalla galleria e sarà aggiunto in EditText, ora voglio se l'utente clicca sull'immagine in EditText si dovrebbe aprire a schermo intero, ho usato qui di seguito il codice: -Come gestire l'evento onClick su imageSpan in 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); 
} 

provato sopra il codice ma non è in ascolto sull'evento onClick, ora, come posso ascoltare l'evento click su questa immagine ed eseguire ulteriori attività?

risposta

7

cliccabile Span alle stesse posizioni iniziale e finale del EditText.

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

anche

editText.setMovementMethod(LinkMovementMethod.getInstance()); 

non posso scrivere l'intero codice per voi. Prova il campione di seguito: -

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

ho provato setMovementMethod ma non funziona, ti prego di spiegare in dettaglio, dove dovrei cambiare nella mia SOPRA codice (metodo addToEdt (bitmap bitmap)) –

+1

span di ImageSpan = nuovo ImageSpan (d, ImageSpan.ALIGN_BASELINE); ss.setSpan (span, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); Allo stesso modo aggiungi clickpanpan alla stessa posizione iniziale e finale -> 0,3. – Rahul

+1

mi spiace non capisco, puoi modificare il mio codice e postare come risposta, se funziona, accetterò la tua risposta :) –

1

Prova

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); 

aggiungere anche questo:

yourEditText.setMovementMethod(LinkMovementMethod.getInstance()); 
+1

Grazie, basta provare il codice allora gli darà le risposte :) –

+1

non funziona, il fuoco un brindisi onClick ma non ascoltando cliccare evento :( –

+0

@Nishusharma Date di nuovo uno sguardo per favore. Aggiungere l'ultima riga –

1

non ho trovato utilizzando ClickableSpan e setMovementMethod accettabile visti i problemi che provoca. Non credo che questi siano stati pensati per essere usati nel controllo di EditText.

Inoltre, ho bisogno di sapere dove l'utente ha fatto clic nello span. Il mio intervallo di immagini ha un pulsante di chiusura X sul lato destro e voglio sapere se l'utente ha fatto clic su X anziché fare semplicemente clic sull'etichetta.

così ho trovato un altro modo:

  • sottoclasse ImageSpan e l'override del metodo draw di chiamare solo il super, ma anche per memorizzare il x/y/sinistra/in alto a variabili membro - così, ora si sa dove lo span è posizionato all'interno di EditText.
  • Sottoclasse EditText e gestire onTouchEvent solo per chiamare il super, ma anche ottenere i tuoi span e colpire ogni test per scoprire se l'utente ha toccato lo span (o una parte dello span).

Ecco, questo metodo funziona senza effetti collaterali.

Problemi correlati