1

Я пытаюсь использовать layout_weight для линейного макета для высоты внутри прокрутки. Однако я считаю, что layout_weight будет работать только с fillViewPort = true, и если для расширения linear_weight достаточно свободного пространства.layout_weight не работает, когда макет внутри ScrollView больше, чем ScrollView

Я привел три примера ниже, и я хочу сделать textView одинаковым размером в # 2 и # 3 как # 1 на уровне xml. Как вы можете видеть в ссылке, в # 2, # 3, textView был автоматически изменен.

Вот мои примеры. Текстовые элементы и кнопки заключены внутри LinearLayout, а затем внутри scrollView.

1. Layout_weight работает отлично относительно родителя. (Рабочий)

http://s22.postimg.org/v0gl2tmyp/Screen_Shot_2013_06_26_at_4_30_51_PM.png

2. Layout_weight работает относительно остального пространства, а не родителей. (Не работает)

http://s22.postimg.org/sx65v5n5t/Screen_Shot_2013_06_26_at_4_30_44_PM.png

3 Layout_weight игнорировали (не работает)

http://s22.postimg.org/ibmaj5gu9/Screen_Shot_2013_06_26_at_4_40_32_PM.png

Вот мой xml-код для # 3. # 2 и # 1 - это в основном тот же код с меньшими или отсутствующими кнопками.

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/scroller" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:weighSum="1" 
    android:fillViewport="true" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:weightSum="10" > 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 

     <Button 
      android:layout_width="30dip" 
      android:layout_height="30dip" 
      android:text="Accept" /> 


     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="6" 
      android:background="#AAABBB" 
      android:text="hello" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="3" 
      android:background="#BBBAAA" 

      android:text="hello" /> 

     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="5" 
      android:background="#AAABBB" 

      android:text="hello" /> 
    </LinearLayout> 

</ScrollView> 
+0

(рабочий пример) http://s22.postimg.org/v0gl2tmyp/Screen_Shot_2013_06_26_at_4_30_51_PM.png –

+0

Можете ли вы добавить xml для этих трех сценариев? Это поможет сделать более понятным то, что вы пытаетесь выполнить. –

+0

Что именно не работает для вас? Или вы хотите, чтобы весь макет был сделан кем-то другим? –

ответ

2

Веса работают так, как они были разработаны. Возможно, не так, как вы хотите, чтобы они «работали», но говорят, что они «не работают» неточны. Подумайте о третьем случае на секунду, какой размер в пикселях вы ожидаете от TextViews? Массы - это процент от доступного пространства (не общий размер родителя). Scrollview и linearlayout - это, как минимум, размер вашего экрана, иначе сумма всех просмотров детей. Итак, если ваши взгляды ваших детей превышают размер экрана (те, у кого нет весов), сколько места вы ожидаете выделить для остальных видов (те, у которых 0dp и веса)? Дело в том, что объем пространства произволен, android не будет пытаться предположить, сколько места вы хотите, потому что у него нет возможности узнать.

TL; DR - установите minHeight (в формате dp) в текстовом режиме, чтобы обрабатывать случай, когда у вас слишком много кнопок.

+1

Да, вы правы. Я посмотрел исходный код линейного макета, и он работает только с ** оставшимся пространством **, и любой макет, который превышает пространство, будет установлен на wrap_content. Спасибо за ваш ответ. Я хочу, чтобы был лучший способ манипулировать дочерним макетом в ScrollView. –

1

Попробуйте установить layout_height = "0dp" на элементы с layout_weight. Прилагаемый объект макета будет использовать любое свободное пространство, чтобы вырастить их как можно больше.

Также ваше использование weightSum немного сомнительно. Обычно weightSum должен быть> = общим весом закрытых представлений. У вас есть один weightSum, где ни один из закрытых представлений не имеет веса, а другой, где общий вес закрытых просмотров превышает weightSum. Этот второй случай приведет к странному поведению.

+0

Привет Спасибо за ответ. Моя сумма весов больше, чем весов, потому что для проверки, может ли она сделать виртуальное измерение в ScrollView больше. Однако оказывается, что layout_weight может использовать только ** оставшееся свободное пространство **. Таким образом, верхняя граница будет просто обрезана. –

2

Изображения - это именно то, что я ожидал бы увидеть для вашего xml.

Это может помочь вам:

  1. Когда система компоновки сдачи View с на экране, используя вес подход, он выделяет только свободное пространства в зависимости от веса, а не общих пространство. Поэтому, чтобы выделить это пространство в соответствии с весами (это то, что большинство людей интуитивно ожидают), вы должны установить измерение, в котором вы хотите, чтобы он работал в 0dip. Итак, для тех Button с и TextView с вам необходимо установить

    android:layout_height = "0dip" 
    
  2. Вам также может понадобиться, чтобы заставить ScrollView заполнить окно просмотра, чтобы остановить все морщили вверх. См here

    android:fillViewport="true" 
    
  3. личные наблюдения. Иногда весы, похоже, работают в обратном (т.е. меньшие веса дают больше места). YMMV.

+0

Привет Спасибо за ответ. Я помещал туда кнопки, чтобы сделать макет более крупным и никакая другая причина. Меня интересует только то, что textViews соотносятся с родительским макетом. Кроме того, я редактировал код, я случайно вставил неправильный код, но в любом случае, случай №3 не работает. –

+0

Я немного смущен. Картинка, которую вы показываете для макета 3, - именно то, что я ожидал бы от xml. Что вы ожидали? –

+0

Я хотел, чтобы textViews возрастал относительно веса и его родителя. Таким образом, textView # 1 будет расти на 60%, textView # 2 будет расти на 30%, textView # 3 будет расти на 50% в высоту. –