7

Używam tego samego tytułu z this question, ponieważ myślę, że moje pytanie jest bardzo podobne do tego, przeczytałem i przetestowałem zaakceptowaną odpowiedź bardzo uważnie, jednak zaakceptowana odpowiedź nie działa dla mnie. Pozwól mi opisać moje pytanie:Android EditText: Jak utworzyć pusty akapit punktora przez BulletSpan?

Mój kod wygląda następująco:

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

Co chcę zobaczyć to:

  • b
  • [Chcę zobaczyć Trzeci punkt tutaj, ale się nie wyświetla]

Próbowałem Spannable.SPAN_INCLUSIVE_INCLUSIVE, Spannable.SPAN_INCLUSIVE_EXCLUSIVE, Spannable.SPAN_EXCLUSIVE_INCLUSIVE, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE, ale żadna z tych flag nie działa dla mnie.

A jeśli mogę użyć tych kodów:

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

Potem uzyskać oczekiwany wynik:

  • się
  • b
  • c

pracuję nad edytor tekstu sformatowanego, gdy użytkownik kliknie ikonę punktora, I ne ed, aby pokazać pustą kulę, ale teraz nie jestem pewien, na czym polega problem, ponieważ chcę utworzyć nową pustą przestrzeń BulletSpan (z kropką, ale bez znaków), ale jeśli nie ma znaków w span początek i koniec, kropka nie pojawia się.

+0

Obecnie mam projekt o bogatej edytora tekstu na Androida: https://github.com/chinalwb/are, można zapoznać się, jeśli trzeba. –

Odpowiedz

9

To jest brzydkie rozwiązanie, ale nie znalazłem nic lepszego - spróbuj dodać pustą postać na końcu (coś w rodzaju przestrzeni o zerowej szerokości). To produkuje wynik, który chcesz (przynajmniej wizualnie):

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

wynik jest: enter image description here

Idealnie chciałbym zrobić niestandardową EditText klasę, która dołącza tę postać wewnętrznie, ale usuwa je kiedy tekst jest wysyłany do dowolnego innego obiektu.

+1

Hmmm ... tak, mogę sobie wyobrazić posiadanie 'getRawText()' na podklasie, która zwraca 'super.getText()' (i pozostawia przestrzeń o zerowej szerokości), a następnie przesłonięcie 'getText()', aby to usunąć postać.Rozważyłem i odrzuciłem ten podstawowy pomysł, ale nie myślałem o przestrzeni o zerowej szerokości, ponieważ myślałem o dodaniu rzeczywistych białych znaków. Przestrzeń o zerowej szerokości sprawia, że ​​jest bardziej smaczna. Czy napotkasz problemy z czcionkami, które nie honorują tej konkretnej postaci Unicode? Wielkie dzięki! – CommonsWare

+0

Nie zauważyłem jeszcze żadnych problemów, ale tak naprawdę nie testowałem zbyt wiele. Właściwie to nie jestem wielkim fanem tego rozwiązania - po prostu nie znalazłem jeszcze nic lepszego. :/ –

+0

Nie miałem szansy na przetestowanie tych odpowiedzi i nie upłynie, zanim upłynie okres karencji. Wszystkie trzy dotyczą umieszczenia czegoś na linii w ostatnim pocisku. Spośród tych trzech, ten (IMHO) jest jednym z najmniej prawdopodobnych do wprowadzenia artefaktów wizualnych, dlatego otrzymuje nagrodę. Biorąc to pod uwagę, ponieważ jeszcze nie próbowałem żadnego z nich, YMMV. – CommonsWare

1

Mam proste rozwiązanie tego, po prostu dodaj spację na końcu nowej linii

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

Jest to w zasadzie takie samo, jak odpowiedź Samuila, z tym, że ma mniejszy wpływ wizualny. Biorąc pod uwagę, w jaki sposób użytkownik kliknie na "EditText", twoja przestrzeń będzie faktycznie zauważalna (np. Użytkownik kliknie i zamknie się na końcu ostatniego pocisku, co spowoduje powstanie spacji). W każdym razie dzięki! – CommonsWare

+0

Próbowałem kodu i miejsce nie jest zauważalne, a nawet jeśli klikniesz użytkownik jest we właściwym miejscu. – blganesh101

+0

OK, przeprowadzę kilka testów. Dzięki! – CommonsWare

2

Czy to dobrze?

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

Rezultatem jest

enter image description here

+0

Jeśli to zależy od wywołania 'setSelection()', nie jest ono dobre, o ile efekt może zostać utracony, gdy użytkownik kliknie gdzieś. – CommonsWare

+0

ponieważ ustawiamy tekst programowo, bez setSelection() kursor będzie tuż przed "a". Ale w przeciwnym razie wszystkie 3 pociski pojawiają się jak powyżej. – krishnakumarp

+0

można użyć metody setTextKeepState() –