7

Io uso lo stesso titolo con this question, perché penso che la mia domanda sia molto simile a quella, ho letto e testato la risposta accettata con molta attenzione, tuttavia la risposta accettata non funziona per me. Lasciatemi descrivere la mia domanda:Android EditText: come creare un paragrafo punto elenco vuoto da BulletSpan?

mio codice è simile:

EditText myEdit = (EditText) this.findViewById(R.id.myedit); 
myEdit.setText("a\nb\n"); 
Spannable s = myEdit.getText(); 
s.setSpan(new BulletSpan(30), 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
s.setSpan(new BulletSpan(30), 2, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
s.setSpan(new BulletSpan(30), 4, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
myEdit.setText(s); 

Quello che voglio vedere è:

  • un
  • b
  • [voglio vedere la 3 ° punto qui, ma non viene visualizzato]

Ho provato Spannable.SPAN_INCLUSIVE_INCLUSIVE, Spannable.SPAN_INCLUSIVE_EXCLUSIVE, Spannable.SPAN_EXCLUSIVE_INCLUSIVE, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, ma nessuna di queste bandiere funziona per me.

E se uso questi codici:

EditText myEdit = (EditText) this.findViewById(R.id.myedit); 
myEdit.setText("a\nb\nc"); 
Spannable s = myEdit.getText(); 
s.setSpan(new BulletSpan(30), 0, 1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
s.setSpan(new BulletSpan(30), 2, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
s.setSpan(new BulletSpan(30), 4, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); 
myEdit.setText(s); 

Poi ho ottenere il risultato atteso:

  • un
  • b
  • c

sto lavorando un editor di testo avanzato, quando l'utente fa clic sull'icona a forma di puntino, I ne per mostrare un proiettile vuoto, ma ora non sono sicuro di quale potrebbe essere il problema, dato che voglio creare un nuovo BulletSpan vuoto (con solo un punto, ma senza caratteri dopo), ma se non ci sono caratteri nello span inizio e fine, il punto non viene visualizzato.

+0

Al momento ho un progetto sulla ricco editor di testo su Android: https://github.com/chinalwb/are, è possibile fare riferimento a se avete bisogno. –

risposta

9

È una soluzione brutta, ma non ho trovato nulla di meglio - prova ad aggiungere un carattere vuoto alla fine (qualcosa come lo spazio a larghezza zero). Questo sta producendo il risultato che desideri (almeno visivamente):

public void setBulletText(EditText myEdit, String text) { 
     String[] lines = TextUtils.split(text, "\n"); 
     SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); 
     String line = null; 
     for (int index = 0; index < lines.length; ++index) { 
      line = lines[index]; 
      int length = spannableStringBuilder.length(); 
      spannableStringBuilder.append(line); 
      if (index != lines.length - 1) { 
       spannableStringBuilder.append("\n"); 
      } else if (TextUtils.isEmpty(line)) { 
       spannableStringBuilder.append("\u200B"); 
      } 
      spannableStringBuilder.setSpan(new BulletSpan(30), length, length + 1, 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
     } 
     myEdit.setText(spannableStringBuilder); 
    } 

Il risultato è: enter image description here

Idealmente mi piacerebbe fare un EditText classe personalizzata che aggiunge questo personaggio internamente, ma lo rimuove quando il testo viene inviato a qualsiasi altro oggetto.

+1

Hmmm ... sì, posso immaginare di avere un 'getRawText()' nella sottoclasse che restituisce 'super.getText()' (e lascia lo spazio a larghezza zero), quindi sovrascrive 'getText()' stesso per rimuoverlo carattere.Avevo preso in considerazione e respinto questa idea di base, ma non avevo pensato allo spazio a larghezza zero, poiché stavo pensando di aggiungere spazi bianchi reali. Lo spazio a larghezza zero lo rende più appetibile. Hai avuto problemi con i font che non rispettano quel particolare carattere Unicode? Grazie molto! – CommonsWare

+0

Non ho ancora notato problemi, ma non ho nemmeno provato molto. In realtà non sono un grande fan di questa soluzione - non ho ancora trovato niente di meglio. :/ –

+0

Non ho avuto la possibilità di testare queste risposte, e non prima che scada il periodo di grazia. Tutti e tre implicano mettere qualcosa in linea per l'ultimo proiettile. Dei tre, questo (IMHO) è il meno probabile che introduca artefatti visivi, motivo per cui sta ottenendo la taglia. Detto questo, dato che non ho ancora provato nessuno di questi, YMMV. – CommonsWare

1

Ho una semplice soluzione a questo, basta aggiungere uno spazio alla fine della nuova linea

EditText myEdit = (EditText) this.findViewById(R.id.myedit); 
myEdit.setText("a\nb\n "); //notice the space after newline 
Spannable s = myEdit.getText(); 
s.setSpan(new BulletSpan(30), 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
s.setSpan(new BulletSpan(30), 2, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
s.setSpan(new BulletSpan(30), 4, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
myEdit.setText(s); 
+0

Questo è praticamente lo stesso della risposta di Samuil, tranne che ha un impatto visivo minore. Dato il modo in cui l'utente fa clic su "EditText", il tuo spazio sarà effettivamente visibile (ad es., I clic dell'utente e si concluderà alla fine dell'ultimo proiettile, risultando in uno spazio iniziale). Grazie comunque! – CommonsWare

+0

Ho provato il codice e lo spazio non è evidente e anche se si fa clic l'utente è nel posto giusto. – blganesh101

+0

OK, eseguirò alcuni test. Grazie! – CommonsWare

2

È un bene?

EditText myEdit = (EditText) this.findViewById(R.id.myedit); 
myEdit.setText("a\nb\n\n"); 
Spannable s = myEdit.getText(); 
s.setSpan(new BulletSpan(30), 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
s.setSpan(new BulletSpan(30), 2, 3, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
s.setSpan(new BulletSpan(30), 4, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
myEdit.setText(s); 
myEdit.setSelection(s.length()-1); 

Il risultato è

enter image description here

+0

Se questo si basa sulla chiamata 'setSelection()', non è buono, nella misura in cui l'effetto può essere perso se l'utente fa clic da qualche parte. – CommonsWare

+0

dal momento che stiamo impostando il testo a livello di codice, senza setSelection() il cursore sarà appena prima di 'a'. Altrimenti, tutti e 3 i proiettili appaiono come sopra. – krishnakumarp

+0

potresti usare il metodo setTextKeepState() –