我有一个TextView,它包含一个Spannable字符串。该字符串包含一堆文本,其中第一个单词的类型大小是字符串其余部分的两倍。
问题在于,由于第一个单词的大小增加,第一行和第二行之间的行间距远大于后续行之间的行间距。
http://img.skitch.com/20100615-fwd2aehbsgaby8s2s9psx3wwii.png
使用以下代码段创建了spannable字符串:
// Price
CharSequence text = "$30 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."
final Pattern priceRegex = Pattern.compile("^(.[0-9]+)\\s.*");
final Matcher m = priceRegex.matcher(text!=null ? text : "");
if( m.matches() ) {
text = new SpannableString(text);
((SpannableString)text).setSpan(new RelativeSizeSpan(2), 0, m.end(1), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
如何修复TextView以使所有行具有相同的间距?
答案 0 :(得分:43)
您可以尝试使用以下TextView属性之一:
android:lineSpacingMultiplier
android:lineSpacingExtra
至少尝试使所有线条的高度相同(与第一条线条相同)。
答案 1 :(得分:2)
经过大量的反复试验后,我得到了一个非常讨厌的解决方案:
我为文本中的每个空格添加了与强调单词相同的双倍文本大小的spannables。这样整个TextView就有了相同的(大)行间距。请注意,您无法重复使用spannable。
然后我给TextView一个负的lineSpacingExtra,这样行间距看起来很好。
为了避免由于文本大小增加造成空间宽阔的空间,我在每个空间添加了ScaleXSpan,将它们缩放到原始大尺寸的50%。
即使对于包含本地化字符串的TextView,此方法也应该有效(只要每行都包含至少一个空格字符,您就不会知道强调单词出现在哪个位置或行的长度)。
答案 2 :(得分:1)
我写了这个函数:
<强> INPUT 强>
LinearLayout ll:
布局将是您的“TexView”(确保其方向是垂直的)
String money:
你想要的不同的字符串(在你的情况下更大的文本化)
字符串文字:
文字
上下文mContext
上下文
该怎么做
我评论了你必须编辑的部分
private void populateText(LinearLayout ll,
String money, String text , Context mContext) {
String [] textArray = text.split(" ");
Display display = getWindowManager().getDefaultDisplay();
ll.removeAllViews();
int maxWidth = display.getWidth() - 20;
LinearLayout.LayoutParams params; // to be used over and over
LinearLayout newLL = new LinearLayout(mContext);
newLL.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
newLL.setGravity(Gravity.LEFT);
newLL.setOrientation(LinearLayout.HORIZONTAL);
int widthSoFar = 0;
///FIRST INSERT THE MONEY TEXTVIEW
LinearLayout LL = new LinearLayout(mContext);
LL.setOrientation(LinearLayout.HORIZONTAL);
LL.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM); //THIS IS IMPORTANT TO keep spacing up not down
LL.setLayoutParams(new ListView.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
TextView TV = new TextView(mContext);
TV.setText(money);
//TV.setTextSize(size); <<<< SET TEXT SIZE
TV.measure(0, 0);
params = new LinearLayout.LayoutParams(TV.getMeasuredWidth(),
LayoutParams.WRAP_CONTENT);
//params.setMargins(5, 0, 5, 0); // YOU CAN USE THIS
LL.addView(TV, params);
LL.measure(0, 0);
widthSoFar += TV.getMeasuredWidth();// YOU MAY NEED TO ADD THE MARGINS
newLL.addView(LL, params);
for (int i = 0 ; i < textArray.length ; i++ ){
LL = new LinearLayout(mContext);
LL.setOrientation(LinearLayout.HORIZONTAL);
LL.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM);
LL.setLayoutParams(new ListView.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
TV = new TextView(mContext);
TV.setText(textArray[i]);
//TV.setTextSize(size); <<<< SET TEXT SIZE
TV.measure(0, 0);
params = new LinearLayout.LayoutParams(TV.getMeasuredWidth(),
LayoutParams.WRAP_CONTENT);
//params.setMargins(5, 0, 5, 0); // YOU CAN USE THIS
LL.addView(TV, params);
LL.measure(0, 0);
widthSoFar += TV.getMeasuredWidth();// YOU MAY NEED TO ADD THE MARGINS
if (widthSoFar >= maxWidth) {
ll.addView(newLL);
newLL = new LinearLayout(mContext);
newLL.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
newLL.setOrientation(LinearLayout.HORIZONTAL);
newLL.setGravity(Gravity.LEFT);
params = new LinearLayout.LayoutParams(LL
.getMeasuredWidth(), LL.getMeasuredHeight());
newLL.addView(LL, params);
widthSoFar = LL.getMeasuredWidth();
} else {
newLL.addView(LL);
}
}
ll.addView(newLL);
}
注意强>
我还没有测试过它......我用它做了更复杂的事情而且工作正常......你可能需要调整一下。
答案 3 :(得分:0)
我认为你不能:(。 Android os根据字体大小计算线条之间的间隙,因此'30 $'使第1行和第2行之间的间隙变大,我不知道是否可以控制这个间隙大小。
要解决此问题,您可以轻松扩展LinearLayuot并将方向垂直放置。然后将2个textviews与fillparent一起放入宽度....
而不是实现函数,让我们说setNoGapText(String s); ,在这个函数中,你可以测量顶部的textview中可以容纳的文本(这可以用textutils完成),而文本的其余部分将适合textview2 ...
在此textview之间,您可以使用填充和边距属性,因此线条之间的间隙看起来就像您想象的那样。