2010-06-15 83 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

相關問題