2010-06-15 60 views
25

我有一个TextView,它包含一个Spannable字符串。该字符串包含一串文本,其中的第一个单词是字符串的其余部分的两倍。如何在多种字体大小的TextView中调整行高?

问题在于,由于第一个单词的大小增加,第一个和第二个行之间的行距远大于后续行之间的行距。

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

我认为你不能:(. Android os根据字体大小计算行间的差距,所以'30 $'使得行1和行2之间的差距更大,我不知道如果能够控制这一差距的大小。

为了解决这个问题,你可以轻松地扩展LinearLayuot,把方向垂直。不是把2个textviews与fillparent的宽度....

比实现功能,让说setNoGapText(String s); ,在这个函数中,你可以测量可以在上面的textview适合的文本(这可以用textutils完成),并且比文本的其余部分我适合textview2 ...

这个textview之间,你可以玩填充和边距属性,所以线之间的差距将看起来就像你想象他们。

1

我写了这个功能:

INPUT

  • 的LinearLayout LL:

    布局,这将是你的 “TexView”(确保它的方向是垂直的)

  • 串钱:

    要有所不同(在你的情况下,大TEXTSIZE)

  • 字符串文本字符串:

    文本

  • 上下文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); 
} 
01件

注意

我没有测试过...我用它来进行更复杂的东西,这是工作......你可能需要调整一下。

43

您可以尝试使用这些TextView的属性之一:

android:lineSpacingMultiplier 
android:lineSpacingExtra 

至少尝试,使所有线路相同的高度(同第一个)。

+3

This works。它应该被接受。 – mxcl 2012-02-23 18:53:18

+1

是否也会按比例增加第一行的行间距? – emmby 2012-04-26 22:17:03

+4

请注意'android:lineSpacingMultiplier'仅在API级别16和更高版本中可用。 – yiati 2013-06-18 16:13:16

2

大量的试验和错误之后,我有一个非常哈克解决方案的工作:

  1. 我加spannables具有相同一倍文字大小作为强调字的文本内的每个空间。这样整个TextView获得了相同的(大)行间距。请注意,你不能重用一个可跨越表。

  2. 然后我给TextView一个负值lineSpacingExtra,所以行间距再次看起来不错。

  3. 为了避免由于文本大小增加而导致的非空间宽的空间,我在每个空间添加了一个ScaleXSpan,将它们缩放到其原始大尺寸的50%。

这种方法应该工作,甚至为持有本地化字符串TextViews(你永远不知道在哪个位置出现的强调词或你的线有多长),只要每行保持至少一个空格字符。

+1

我喜欢你的想法! – Reza 2015-10-06 10:52:36