Android EditText:如何按BulletSpan创建空项目符号段落?

Android EditText:如何按BulletSpan创建空项目符号段落?,android,android-edittext,spannablestring,bulletedlist,spanned,Android,Android Edittext,Spannablestring,Bulletedlist,Spanned,我使用与相同的标题,因为我认为我的问题与那个问题非常相似,我非常仔细地阅读并测试了被接受的答案,但是被接受的答案不适合我。让我描述一下我的问题: 我的代码如下所示: EditText myEdit = (EditText) this.findViewById(R.id.myedit); myEdit.setText("a\nb\n"); Spannable s = myEdit.getText(); s.setSpan(new BulletSpan(30), 0, 1, Spannabl

我使用与相同的标题,因为我认为我的问题与那个问题非常相似,我非常仔细地阅读并测试了被接受的答案,但是被接受的答案不适合我。让我描述一下我的问题:

我的代码如下所示:

 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);
我想看到的是:

  • a
  • b
  • [我想在这里看到第三颗子弹,但它没有出现]
我尝试了
Spannable.SPAN_INCLUSIVE_INCLUSIVE
SPAN nable.SPAN_INCLUSIVE_INCLUSIVE
SPAN nable.SPAN_INCLUSIVE_INCLUSIVE
,但这些标志对我都不起作用

如果我使用这些代码:

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);
然后我得到了预期的结果:

  • a
  • b
  • c

我正在使用一个富文本编辑器,当用户单击项目符号图标时,我需要显示一个空项目符号,但现在我不确定问题是什么,因为我想创建一个新的空项目符号span(只有一个点,但后面没有字符),但如果span的开始和结束没有字符,则该点不会显示。

这是一个丑陋的解决方案,但我没有找到更好的方法——尝试在结尾添加一个空字符(类似于零宽度空格)。这将产生您想要的结果(至少在视觉上):

public void setBulletText(编辑文本myEdit,字符串文本){
String[]line=TextUtils.split(text,“\n”);
SpannableStringBuilder SpannableStringBuilder=新的SpannableStringBuilder();
字符串行=null;
对于(int index=0;index
结果是:


理想情况下,我会创建一个自定义的
EditText
类,在内部追加此字符,但在将文本发送到任何其他对象时将其删除。

我有一个简单的解决方案,只需在换行符的末尾添加一个空格即可

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);
这个好吗

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);
结果是


Hmmm。。。是的,我可以想象在返回
super.getText()
(并保留零宽度空间)的子类上有一个
getRawText()
,然后重写
getText()
本身以删除该字符。我考虑并拒绝了这个基本想法,但我没有考虑过零宽度空间,因为我正在考虑添加实际的空白。零宽度的空间使它更可口。您是否遇到过字体不符合特定Unicode字符的问题?非常感谢!我还没有注意到任何问题,但我也没有做过很多测试。事实上,我不是这个解决方案的忠实粉丝——只是还没有找到更好的解决方案/我还没有机会测试这些答案,在赏金宽限期到期之前也不会。这三个步骤都涉及到为最后一颗子弹准备一些东西。在这三者中,这一个(IMHO)是最不可能引入视觉伪影的,这就是为什么它得到赏金的原因。尽管如此,由于我还没有尝试过任何一种,YMMV。@SamuilYanovski,谢谢你的回答,对我来说看起来不错,但我会花更多的时间将其连接到我的应用程序中,我会回来更新我的状态。在Commonware,非常感谢您让我的问题变得更加清晰,以便我能够得到这些答案,我指的是CommonsWare for Rich Text Editor development,但似乎还有很长的路要走,我正在路上:)对不起,我迟到了。我对它进行了测试,效果非常好!我将打开我的富文本编辑器的源代码,它包含一个简单的列表(数字/项目符号)项编辑、粗体、斜体、下划线、删除线、背景色、增加/减少缩进等。。。希望它能帮助你,也希望你能对它进行改进。这与Samuil的回答基本相同,只是他的视觉冲击较小。考虑到用户单击编辑文本的方式,您的空格实际上是显而易见的(例如,用户单击并在最后一个项目符号的末尾结束,从而产生前导空格)。不过,谢谢!我尝试了代码,但空格不明显,即使您单击用户位于正确的位置。好的,我将运行一些测试。谢谢好的,当用户将光标拖动到下一行时,他可以得到前导空格。但是单击项目符号,它会显示在开始处如果依赖于
setSelection()
调用,这并不好,因为如果用户单击某个位置,效果可能会丢失。因为我们是以编程方式设置文本,没有setSelection(),光标将刚好位于“a”之前。但除此之外,所有3个项目符号都如上所示。您可以使用setTextKeepState()方法我目前有一个关于Android上的富文本编辑器的项目:,如果需要,您可以参考。
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);