2017-01-25 3 views
4

Я хотел бы установить layout_weight из TextView с tv_long_text до 80% в следующем LinearLayout из вертикальной ориентации.Android установить максимальную ширину в процентах от TextView в LinearLayout вертикальной ориентации

<LinearLayout 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:orientation="vertical"> 
    <TextView 
      android:id="@+id/tv_short_text" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      tools:text="short text" /> 
    <TextView 
      android:id="@+id/tv_long_text" 
      android:layout_height="wrap_content" 
      android:layout_width="0dp" 
      android:layout_weight="0.8" 
      tools:text="a pretty long text" /> 
</LinearLayout> 

выше не работает, потому что ориентация родителя TextView является вертикальной.

Итак, я попытался установить android:layout_width="match_parent" в XML, а затем установить ширину во время выполнения, получая измеренную ширину, а затем устанавливает ширину до 80%, но getMeasuredWidth дает мне 0.

int measuredWidth = longTextView.getMeasuredWidth(); 
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) longTextView.getLayoutParams(); 
params.width = (int) (measuredWidth * 0.8); 
longTextView.setLayoutParams(params); 

Я также пытался установить layout_weight во время выполнения, но это тоже не сработало, и это, вероятно, потому, что это родительский вид в вертикальной ориентации.

longTextView.setLayoutParams(
     new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.WRAP_CONTENT, 
       LinearLayout.LayoutParams.MATCH_PARENT, 
       0.8f) 
); 

Тот, который работал для меня, добавив некоторые дополнительные взгляд для длительного просмотра текста. Но добавлено еще 2 дополнительных просмотров, просто пытающихся установить ширину этого представления в процентах. Есть ли другой эффективный способ сделать это?

<LinearLayout 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:orientation="vertical"> 
    <TextView 
      android:id="@+id/tv_short_text" 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content" 
      tools:text="short text" /> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 
     <TextView 
      android:id="@+id/tv_long_text" 
      android:layout_height="wrap_content" 
      android:layout_width="0dp" 
      android:layout_weight="0.8" 
      android:textStyle="bold" 
      tools:text="a pretty long text" /> 
     <View 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.2"/> 
    </LinearLayout> 
</LinearLayout> 

ответ

4

Я бы не стал возиться с измерениями времени выполнения. Ваше решение со вторым горизонтальным макетом отлично работает, поскольку у вас есть два текстовых окна, расширяющихся по горизонтали.
Другим вариантом было бы PercentRelativeLayout от поддержки библиотеки com.android.support:percent:25.1.0See here

Это из документации

<android.support.percent.PercentRelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    <ImageView 
     app:layout_widthPercent="50%" 
     app:layout_heightPercent="50%" 
     app:layout_marginTopPercent="25%" 
     app:layout_marginLeftPercent="25%"/> 
</android.support.percent.PercentRelativeLayout> 
1

Вы можете использовать android:weightSum, и достичь того же результата без дополнительных View как:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:id="@+id/activity_main" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:weightSum="10" 
      android:orientation="vertical"> 

    <TextView 
     android:id="@+id/tv_short_text" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     tools:text="short text" /> 
    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:weightSum="10"> 
     <TextView 
      android:id="@+id/tv_long_text" 
      android:layout_height="wrap_content" 
      android:layout_width="0dp" 
      android:layout_weight="8" 
      android:textStyle="bold" 
      tools:text="a pretty long text a pretty long text a pretty long text" /> 
    </LinearLayout> 
</LinearLayout> 
+0

все еще есть этот дополнительный LinearLayout обертка: P –

+0

'LinearLayout' обертка с правой стороны остается, что-то должно, так как 80% пространства используется, но' TextView' составляет 80%, а когда вы показываете какой-то текст, только эта область будет использоваться :) –

0

использование android: layout_weight

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 
     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      /> 
     <android.support.v4.widget.Space 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="3"/> 
    </LinearLayout> 

TRY Эта структура позволяет TextView передавать только до 75% ширины экрана. вы можете настроить ширину SPACER для достижения, чего хотите, как 2 для 50%.

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