2014-01-24 9 views
1

У меня есть вертикальный LinearLayout с многострочным TextView, который имеет размер layout_weight 1, а ниже - более сложный макет, который обертывает его содержимое. Если во внешнем не хватает места, я хочу уменьшить количество строк, показанных в TextView. Вместо этого нижняя половина нижней строки просто обрезается.Уменьшить количество строк в многострочном TextView, если не все строки соответствуют

Есть ли способ обойти это? Это в виджетах приложения, поэтому я не могу использовать пользовательские представления.

упрощенный макет XML:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="start|bottom" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:ellipsize="end" 
     android:gravity="fill_vertical" 
     android:maxLines="2" /> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <!-- ... sized content ... --> 

    </LinearLayout> 
</LinearLayout> 

ответ

0

Время назад мне пришлось возиться с этим тоже в основном в пределах клиента IRC, который принимает сотни строк на вкладке, и, к сожалению, ответ нет, нет какой-либо механизм автоматического управления буфером TextView.

Так что пришлись реализовать бесконечный цикл Thread (который я позже конвертировать в Service), который принимает число линий тока TextView, и если оно превышает определенную сумму, он усекается от самого начала буфера (самые старые линии удаляются).

Прилагаю, что я сделал, может быть, это может вам помочь.

static void FreeTextBuffer() { 
    final TextView tv = (TextView) findViewById(R.id.your_textview); 
    final Spanned sptxt = (Spanned) tv.getText(); 

    // This is a workaround, seems that Html.toHtml() passing directly the text makes the system stale - this works 
    final SoftReference<String> texto = new SoftReference<String>(Html.toHtml((Spanned) sptxt.subSequence(0, sptxt.length()))); 
    final int matches = StringUtils.countMatches(texto.get(), "<br>"); 

    if (matches > (3 * maxLines)/2) { 
    // Here I'm counting the amount of \n to cut off (the 0.5 * matches is a tuned solution that works for me) 
    int cutpoint = -1; 
    for (int i = 0; i < 0.5 * matches; i++) 
     cutpoint = texto.get().indexOf("<br>", (cutpoint < 0)? 0 : cutpoint + 1); 

    // Just for the Thread... 
    final int forUIth = cutpoint; 

    if (cutpoint > -1) { 
     ((Activity) globvars.getContext()).runOnUiThread(new Runnable() { 
     public void run() { 
      synchronized(tv) { 
      tv.setText(Html.fromHtml(texto.get().substring(forUIth))); 
      } 
     } 
     }); 
    } 
    } 
} 
+0

К сожалению, это удаленный просмотр (в приложении виджет), поэтому я не могу получить ссылку на TextView. – kpozin