2017-01-11 22 views
1

У меня есть следующий макет как пользовательский вид в AlertDialog.FrameLayout высота не соответствует родительскому

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 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:layout_gravity="center" 
    android:gravity="center" 
    android:padding="16dp"> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:orientation="vertical"> 

     <GridLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_gravity="center" 
      android:columnCount="3"> 

      <TextView 
       android:id="@+id/code1" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:gravity="center" 
       android:text="\u2022" 
       android:textSize="@dimen/match_code_digit_size" 
       tools:ignore="HardcodedText" /> 

      <TextView 
       android:id="@+id/code2" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:layout_marginBottom="20dp" 
       android:gravity="center" 
       android:text="\u2022" 
       android:textSize="@dimen/match_code_digit_size" 
       tools:ignore="HardcodedText" /> 

      <TextView 
       android:id="@+id/code3" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:gravity="center" 
       android:text="\u2022" 
       android:textSize="@dimen/match_code_digit_size" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k1" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="1" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k2" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="2" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k3" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="3" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k4" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="4" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k5" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="5" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k6" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="6" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k7" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="7" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k8" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="8" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k9" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:text="9" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

      <Button 
       android:id="@+id/k0" 
       android:layout_width="@dimen/match_code_button_size" 
       android:layout_height="@dimen/match_code_button_size" 
       android:layout_column="1" 
       android:text="0" 
       android:textSize="@dimen/match_code_button_text" 
       tools:ignore="HardcodedText" /> 

     </GridLayout> 

     <TextView 
      android:id="@+id/error" 
      style="@style/ErrorText" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:gravity="center" 
      android:text="@string/match_error" 
      android:visibility="invisible" /> 

    </LinearLayout> 

    <FrameLayout 
     android:id="@+id/progress" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#80ffffff" 
     android:visibility="visible"> 

     <ProgressBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" /> 

    </FrameLayout> 

</FrameLayout> 

Извините за большой объем макета, поставьте его здесь «как есть».

Обратите внимание на нижний FrameLayout с идентификатором прогресс. Несмотря на то, что у него есть android: layout_height = "match_parent", на устройстве он выглядит как "wrap_content" - имеет высоту, соответствующую только внутреннему ProgressBar. Хотя в Android Studio дизайнеру показалось отлично, занимая весь вид.

Что случилось?

Вот как компоновка выглядит дизайнером

AS designer

и на устройстве (пробовал как эмулятор и реальное устройство, тот же эффект)

Device

+0

вы можете разместить снимок и ожидаемых результатов, а также –

+0

добавить тяжести вашего ребенка кадр макет –

+0

@Alexey проверить мой ответ –

ответ

0

У вас есть два FrameLayouts , @id прогресс один и LinearLayout один.

Первый беглый взгляд на developer.android.com

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

Так что для ваших родителей FrameLayout Сколько детей у Вас есть? (2)

Вы можете, однако, добавить несколько детей в FrameLayout и контроля их положение в FrameLayout, назначая тяжести каждого ребенок, используя атрибут android: layout_gravity.

Есть ли какой-либо серьезности в ваших обоих детях? Нет, не для достижения @id

Виды детей рисуются в стеке, с самым последним добавленным ребенком сверху. Размер FrameLayout - это размер его самого большого ребенка (плюс заполнение), видимый или нет (если разрешен родитель FrameLayout).

Итак, сначала вы добавляете линейную компоновку, а затем добавляете FrameLayout, так что .. ребенок FrameLayout должен быть сверху, и это так. Это ваша проблема?

Даже ваш макет долго можно сократить до этого

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:padding="16dp"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="300dp" 
     android:layout_gravity="center" 
     android:background="#121" 
     android:orientation="vertical"> 
    </LinearLayout> 

    <FrameLayout 
     android:id="@+id/progress" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:background="#567" 
     android:visibility="visible"> 

     <ProgressBar 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" /> 

    </FrameLayout> 

</FrameLayout> 

Выходной (я добавил изображение для линейной компоновки вам не хватает тяжести в вашем ребенка макет кадра):

enter image description here

0

Попробуйте изменить корень FrameLayout на RelativeLayout

0

У меня была такая же проблема, и мне удалось ее исправить. Похоже, никто не заметил этого, но источником вашей проблемы является GridLayout. Как видно из чертежа, нет проблем с FrameLayout, поскольку он действительно соответствует родительскому. Элементы вашего GridLayout имеют фиксированный размер, и это неправильно. Вам нужно установить весы для каждого элемента в GridLayout, чтобы элементы могли растягиваться в соответствии с любым разрешением экрана. Но вес в GridLayout нужно API 21. Таким образом, я предлагаю вам использовать вложенную LinearLayout's с весами элемента устанавливается равным 1.

+0

Нет, попробовали с набором LinearLayout вместо GridLayout - та же проблема :( – Alexey

+0

Вы установили ширину и высоту элементов как фиксированные или с весами? –

+0

То, что я пытаюсь сказать, вы не должны использовать размеры из ' dimen'. –