Android:使用 LeadingMarginSpan 在文本视图中显示项目符号列表?
Android: display bullet list in a textview using LeadingMarginSpan?
我想在文本视图中显示项目符号列表。我可以使用 bulletspan,但是子弹不是很吸引人,而且似乎没有自定义它的方法。我想为我的要点列表使用默认项目符号 (•)。有没有办法使用 LeadingMarginSpan 来获得我想要的效果?基本上,如果该行以项目符号开头,我希望它向左对齐,但是如果该行太长以至于它会中断,那么下一行的文本(中断的文本)应该缩进到与后面的文本相同的水平要点。
* for example
instead of this
* for example
should look like this
我当前的代码:
String[] bulletpoint = {some array of strings};
CharSequence allText = "";
for (int i = 0; i < bulletpoint.length; i++) {
String text = bulletpoint[i];
SpannableString s = new SpannableString(text + "\n");
s.setSpan(new LeadingMarginSpan(BulletSpan.STANDARD_GAP_WIDTH) {
@Override
public int getLeadingMargin(boolean first) {
return 0;
}
@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout layout) {
}
}, 0, text.length(), 0);
allText = TextUtils.concat(allText, s);
}
textview.settext(allText);
您可以使用 BulletSpan
或 LeadingMarginSpan
实现,只需覆盖 drawLeadingMargin()
即可按照您想要的方式绘制项目符号。
参考 BulletSpan
的代码,了解他们如何绘制子弹并将其用作指南:
用代码示例回答:
CharSequence allText = "";
for (String aBulletpoint : bulletpoint) {
String text = aBulletpoint.trim() + ".";
SpannableString spannableString = new SpannableString(text + "\n");
spannableString.setSpan(new LeadingMarginSpan() {
@Override
public int getLeadingMargin(boolean first) {
return getString(R.string.bulletpoint).length() * 50;
}
@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout layout) {
if (first) {
Paint.Style orgStyle = p.getStyle();
p.setStyle(Paint.Style.FILL);
c.drawText(getString(R.string.bulletpoint) + " ", 0, bottom - p.descent(), p);
p.setStyle(orgStyle);
}
}
}, 0, text.length(), 0);
allText = TextUtils.concat(allText, spannableString);
}
someTextView.setText(allText);
我想在文本视图中显示项目符号列表。我可以使用 bulletspan,但是子弹不是很吸引人,而且似乎没有自定义它的方法。我想为我的要点列表使用默认项目符号 (•)。有没有办法使用 LeadingMarginSpan 来获得我想要的效果?基本上,如果该行以项目符号开头,我希望它向左对齐,但是如果该行太长以至于它会中断,那么下一行的文本(中断的文本)应该缩进到与后面的文本相同的水平要点。
* for example
instead of this
* for example
should look like this
我当前的代码:
String[] bulletpoint = {some array of strings};
CharSequence allText = "";
for (int i = 0; i < bulletpoint.length; i++) {
String text = bulletpoint[i];
SpannableString s = new SpannableString(text + "\n");
s.setSpan(new LeadingMarginSpan(BulletSpan.STANDARD_GAP_WIDTH) {
@Override
public int getLeadingMargin(boolean first) {
return 0;
}
@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout layout) {
}
}, 0, text.length(), 0);
allText = TextUtils.concat(allText, s);
}
textview.settext(allText);
您可以使用 BulletSpan
或 LeadingMarginSpan
实现,只需覆盖 drawLeadingMargin()
即可按照您想要的方式绘制项目符号。
参考 BulletSpan
的代码,了解他们如何绘制子弹并将其用作指南:
用代码示例回答:
CharSequence allText = "";
for (String aBulletpoint : bulletpoint) {
String text = aBulletpoint.trim() + ".";
SpannableString spannableString = new SpannableString(text + "\n");
spannableString.setSpan(new LeadingMarginSpan() {
@Override
public int getLeadingMargin(boolean first) {
return getString(R.string.bulletpoint).length() * 50;
}
@Override
public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout layout) {
if (first) {
Paint.Style orgStyle = p.getStyle();
p.setStyle(Paint.Style.FILL);
c.drawText(getString(R.string.bulletpoint) + " ", 0, bottom - p.descent(), p);
p.setStyle(orgStyle);
}
}
}, 0, text.length(), 0);
allText = TextUtils.concat(allText, spannableString);
}
someTextView.setText(allText);