7

Ich verwende den gleichen Titel mit this question, weil ich meine Frage zu denken, dass man sehr ähnlich ist, ich lese und getestet, um die akzeptierte Antwort sehr sorgfältig, aber die akzeptierte Antwort für mich nicht funktioniert. Lassen Sie mich meine Frage beschreiben:Android EditText: Wie erstelle ich einen leeren Bullet-Absatz von BulletSpan?

Mein Code sieht so aus:

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

Was ich will ist sehen:

  • ein
  • b
  • [Ich will das sehen 3. Kugel hier, aber es wird nicht angezeigt]
I 210

versucht Spannable.SPAN_INCLUSIVE_INCLUSIVE, Spannable.SPAN_INCLUSIVE_EXCLUSIVE, Spannable.SPAN_EXCLUSIVE_INCLUSIVE, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, aber keines dieser Flaggen für mich funktioniert.

Und wenn ich diese Codes:

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

Dann bekomme ich das erwartete Ergebnis:

  • eine
  • b
  • c

Ich arbeite an ein Rich-Text-Editor, wenn der Benutzer auf das Aufzählungszeichen klickt, ich ne ed, um eine leere Kugel zu zeigen, aber jetzt bin ich nicht sicher, was das Problem sein könnte, wie ich eine neue leere BulletSpan (mit nur einem Punkt, aber keine Zeichen nach ihm) machen möchte, aber wenn es keine Zeichen in den Span's gibt Anfang und Ende, der Punkt wird nicht angezeigt.

+0

ich derzeit ein Projekt über die Rich-Text-Editor auf Android haben: https://github.com/chinalwb/are, können Sie verweisen, wenn Sie benötigen. –

Antwort

9

Es ist eine hässliche Lösung, aber ich habe es nicht besser gefunden - versuchen, ein leeres Zeichen am Ende des Hinzufügen (so etwas wie Null-Breite Raum). Dies erzeugt das gewünschte Ergebnis (zumindest optisch) möchten:

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

Das Ergebnis ist: enter image description here

Im Idealfall würde ich eine benutzerdefinierte EditText Klasse machen, die intern diesen Charakter anfügt, aber es entfernt wenn der Text an ein anderes Objekt gesendet wird.

+1

Hmmm ... yeah, ich kann mir vorstellen, eine 'getRawText()' für die Unterklasse zu haben, die 'super.getText()' zurückgibt (und den null-width-Raum zurücklässt), dann überschreibt 'getText()' selbst, um das zu entfernen Charakter.Ich hatte diese Grundidee überlegt und abgelehnt, aber ich hatte nicht über den Null-Breiten-Raum nachgedacht, da ich darüber nachdachte, den tatsächlichen Leerraum hinzuzufügen. Der nullbreite Raum macht es schmackhafter. Haben Sie Probleme mit Schriftarten, die dieses spezielle Unicode-Zeichen nicht unterstützen? Danke vielmals! – CommonsWare

+0

Ich habe noch keine Probleme bemerkt, aber ich habe auch nicht viel getestet. Eigentlich bin ich kein großer Fan von dieser Lösung - habe einfach noch nichts besseres gefunden. :/ –

+0

Ich hatte keine Gelegenheit, diese Antworten zu testen, und werde nicht vor Ablauf der Bounty-Gnadenfrist. Alle drei beinhalten, etwas auf die Linie für die letzte Kugel zu setzen. Von den dreien ist diese (IMHO) diejenige, die am wenigsten visuelle Artefakte hervorruft, weshalb sie die Bounty erhält. Davon abgesehen, habe ich noch keinen von ihnen probiert, YMMV. – CommonsWare

1

ich eine einfache Lösung für dieses Problem habe, nur einen Raum am Ende der so gut

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

Das ist im Grunde das gleiche wie Samuils Antwort, außer dass seine visuelle Wirkung geringer ist. Wenn der Benutzer auf den 'EditText' klickt, wird Ihr Platz tatsächlich wahrgenommen (z. B. klickt der Benutzer auf und endet am Ende des letzten Aufzählungszeichens, was zu einem führenden Leerzeichen führt). Trotzdem danke! – CommonsWare

+0

Ich habe den Code ausprobiert und der Platz ist nicht spürbar und selbst wenn Sie klicken, ist der Benutzer an der richtigen Stelle. – blganesh101

+0

OK, ich werde einige Tests durchführen. Vielen Dank! – CommonsWare

2

Ist Newline hinzufügen?

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

Das Ergebnis ist

enter image description here

+0

Wenn dies auf dem 'setSelection()' Aufruf beruht, ist das nicht gut, insofern der Effekt verloren gehen kann, wenn der Benutzer irgendwo klickt. – CommonsWare

+0

da wir den Text programmgesteuert setzen, ohne setSelection() wird der Cursor direkt vor 'a' stehen. Aber ansonsten erscheinen alle 3 Kugeln wie oben. – krishnakumarp

+0

könnten Sie setTextKeepState() -Methode verwenden –