0

настоящее время у меня LinearLayout с тремя элементами, каждый из которых имеет вес одного:Есть ли способ программно вставить представление в LinearLayout, чьи существующие элементы имеют вес и не влияют на эти веса?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_marginTop="16dp" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:orientation="horizontal"> 

    <TextView 
     android:id="@+id/happy_text" 
     style="@style/TextAppearance.AppCompat.Subhead" 
     android:layout_width="65sp" 
     android:layout_height="wrap_content" 
     android:maxLines="1" 
     tools:text="Unhappy" /> 

    <SeekBar 
     android:id="@+id/happiness_seekbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:max="100" 
     android:theme="@style/happinessSeekbarTheme" /> 

</LinearLayout> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:gravity="center_vertical"> 

    <TextView 
     android:id="@+id/stress_text" 
     style="@style/TextAppearance.AppCompat.Subhead" 
     android:layout_width="65sp" 
     android:layout_height="wrap_content" 
     android:maxLines="1" 
     android:text="@string/stress" /> 

    <SeekBar 
     android:id="@+id/stress_seekbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:max="100" 
     android:theme="@style/stressSeekbarTheme" /> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:gravity="center_vertical"> 

    <TextView 
     android:id="@+id/pain_text" 
     style="@style/TextAppearance.AppCompat.Subhead" 
     android:layout_width="65sp" 
     android:layout_height="wrap_content" 
     android:maxLines="1" 
     android:text="@string/pain" /> 

    <SeekBar 
     android:id="@+id/pain_seekbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:max="100" 
     android:maxHeight="3dp" 
     android:theme="@style/painSeekbarTheme" /> 

</LinearLayout> 

И это выглядит следующим образом:

enter image description here

В моей программе, я m программно создавать и вставлять TextView с высотой & ширина WRAP_CONTENT в корневой вид:

TextView tView = new TextView(this); 

LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
       ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT); 

tView.setLayoutParams(p); 

Я вычислил X & Y над большим пальцем SeekBar и установил для них значения X & Y TextView.

Однако, когда я добавляю TextView, я полагаю, что программа делает это добавить маржу TextView к мнению корня и поэтому существующий взвешенный Чайлдс меньше мест для работы, заставляя их выглядеть сжат так:

enter image description here

Есть ли способ вставить TextViews, не затрагивая веса существующих видов в макете?

ответ

2

Веса равны процентам. С тремя элементами, имеющими вес 1, каждый из них будет иметь 33% от общей высоты. Если больше не нужно разделять высоту, доступной высотой является вся высота макета. Но, если вы разместите еще один вид внутри макета, который занимает некоторую часть этой высоты, будет меньше доступной высоты для наших взвешенных представлений. Они все еще собираются взять 33% от общей высоты, но сейчас этого меньше.

Теперь мы знаем, что для того, чтобы 33% были одинаковой высоты, нам нужно поддерживать общую доступную высоту одинаково. Поэтому, когда мы добавляем представление, чтобы занять некоторую, если эта высота, нам нужно добавить к общей высоте для компенсации.

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

Итак, для выполнения этой работы есть два шага.

  1. Вычислить высоту TextView вы добавляете
  2. увеличить высоту LinearLayout по расчетной высоте

Существует очень простое решение, которое мы можем использовать сразу же, если это устраивает наш проблема: фиксированная высота. Если мы установим TextView на предопределенную высоту, мы уже знаем, как увеличить высоту LinearLayout.

Однако, если мы не знаем, сколько высоты потребуется, мы должны вычислить его, измерив его. Это довольно хорошо освещенная тема. Например, вы можете узнать больше об этом here.

Как только вы получите высоту, вам нужно будет увеличить высоту LinearLayout.Есть несколько способов сделать это, но простой подход может выглядеть так:

ViewGroup.LayoutParams params = LinearLayout.getLayoutParams(); 
params.height = params.height + textViewHeight; 
linearLayout.setLayoutParams(params); 

Надеюсь, что это поможет.

+0

Спасибо, я постараюсь сделать это. О предоставленном фрагменте кода: задайте параметры макета с помощью textViewHeight, добавьте textViewHeight к существующей высоте или замените его полностью? – damememan

+0

А, добавьте его, не замените. Я отредактирую свой ответ. – DanielLaneDC

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