我对一系列TextView感兴趣,最终还有一个悬挂式缩进。通过CSS执行此操作的标准方法是将边距设置为X像素,然后将文本缩进设置为-X像素。显然我可以用“android:layout_marginLeft =”Xdp“来做第一个,但是我不知道如何在TextView上施加-X像素。任何想法或解决方法?我很感激任何建议。
答案 0 :(得分:12)
想出如何使悬挂缩进适用于我自己的项目。基本上你需要使用android.text.style.LeadingMarginSpan,并通过代码将它应用到你的文本。 LeadingMarginSpan.Standard采用完整缩进(1个参数)或悬挂缩进(2个参数)构造函数,并且需要为要应用样式的每个子字符串创建新的Span对象。 TextView本身也需要将其BufferType设置为SPANNABLE。
如果您必须多次执行此操作,或者希望在您的样式中包含缩进,请尝试创建TextView的子类,该子类采用自定义缩进属性并自动应用跨度。我已经从静态类型博客的Custom Views & XML attributes tutorial和SO问题Declaring a custom android UI element using XML中获得了大量使用。
在TextView中:
// android.text.style.CharacterStyle is a basic interface, you can try the
// TextAppearanceSpan class to pull from an existing style/theme in XML
CharacterStyle style_char =
new TextAppearanceSpan (getContext(), styleId);
float textSize = style_char.getTextSize();
// indentF roughly corresponds to ems in dp after accounting for
// system/base font scaling, you'll need to tweak it
float indentF = 1.0f;
int indent = (int) indentF;
if (textSize > 0) {
indent = (int) indentF * textSize;
}
// android.text.style.ParagraphStyle is a basic interface, but
// LeadingMarginSpan handles indents/margins
// If you're API8+, there's also LeadingMarginSpan2, which lets you
// specify how many lines to count as "first line hanging"
ParagraphStyle style_para = new LeadingMarginSpan.Standard (indent);
String unstyledSource = this.getText();
// SpannableString has mutable markup, with fixed text
// SpannableStringBuilder has mutable markup and mutable text
SpannableString styledSource = new SpannableString (unstyledSource);
styledSource.setSpan (style_char, 0, styledSource.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
styledSource.setSpan (style_para, 0, styledSource.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
// *or* you can use Spanned.SPAN_PARAGRAPH for style_para, but check
// the docs for usage
this.setText (styledSource, BufferType.SPANNABLE);