2013-05-15 3 views
4

меня 2 TextViews подряд и 2 требования:Использование «ellipsize» в TextView и растягивать вид только при необходимости

1) Если первый TextView не слишком широк, он должен выглядеть следующим образом

| [1 текст] [2 текст]                               |

2) Если первый TextView слишком широк, он должен выглядеть следующим образом

| [1 текст текст текс ...] [2 Текст] |

Второе требование проста, вы можете использовать Android: layout_weight = "1", например:

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:singleLine="true" 
     android:ellipsize="end" 
     android:text="1 text text text text text" 
    /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="2 text" 
    /> 
</LinearLayout> 

, но если первый TextView содержит краткий текст, он выглядит как

| [ 1 текст                              ] [2 текст] |

, что неприемлемо.

Итак, как удовлетворить одновременно требования 1) и 2)?

+0

Ну, при условии, что первый TextView весом 1 будет гарантировать результат, который вы получаете, независимо от того, что, так что это не так. Вы пробовали просто установить его ширину на wrap_content? –

+0

Настройка ширины на wrap_content без использования веса = «1» просто перемещает второй TextView из экрана, если первое представление достаточно велико. –

ответ

7

Тем временем я нашел очень простое решение: просто установите ширину LinearLayout на «wrap_content» вместо «fill_parent».

<LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="WRAP_CONTENT" 
    android:layout_height="wrap_content" 
> 
    <TextView 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:singleLine="true" 
     android:ellipsize="end" 
     android:text="1 text text text text text" 
    /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="2 text" 
    /> 
</LinearLayout> 
+0

Это меня очень сэкономит. Благодарю . – penkzhou

+0

Сохранял меня тоже! Горные породы... – GFPF

1

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

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

Добавить еще View в LinearLayout с android:layout_weight="1000". Это займет все неиспользуемое пространство, если ширина text1 и text2 не превышает ширину экрана. Теперь рассчитать ширину text1 и ширину text2 так:

Rect bounds = new Rect(); 
Paint textPaint = textView1.getPaint(); 
textPaint.getTextBounds(text1, 0, text1.length(), bounds); 
int widthText1 = bounds.width(); 
textPaint = textView2.getPaint(); 
textPaint.getTextBounds(text2, 0, text2.length(), bounds); 
int widthText2 = bounds.width(); 

Теперь вы знаете ширину, что TEXT1 и text2 потребует, если они полностью оказаны.

if (widthText1 + widthText2 > screenWidth) { 
    View3.setVisibility(View.GONE); // Don't need View3 as there is no extra space 
} 

В одном случае View3 займет все оставшееся пространство. В другом случае TextView1 должен быть эллипсирован в конце.

Я на самом деле не проверял это, поэтому не надо слишком сильно на меня, если он не работает.

+0

Ну, у меня было ощущение, что это невозможно сделать без кодирования, но когда вы используете вес = «1», андроид почему-то решает, что он должен эллипсоизировать первый текст, даже если второй TextView не имеет фиксированного размера. Поэтому я подумал, что должен быть какой-то способ. В любом случае, спасибо, ваш код может быть полезен! –

+0

Второй текст имеет фиксированный размер в этом случае, потому что вы использовали «wrap_content». Поэтому механизм компоновки определяет, насколько широким является второй текст. Затем, поскольку первый текст слишком длинный, он эллипсирует это, потому что вы указали, что он может сократить его с помощью эллипсинга. –

+0

Тем не менее, возможно, вам просто нужно использовать «wrap_content» в родительском LinearLayout. –

Смежные вопросы