2016-07-31 3 views
2

У меня есть следующий код xml. Кнопка изображения не выравнивается ниже textView с запасом 5dp. Я думаю, что я ошибаюсь в понимании различных параметров макета. Relativelayout - это детское представление линейного выражения, имеющего несколько других представлений.Layout_Below не выполняется правильно в relativelayout

 <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="40"> 

     <com.github.lzyzsd.circleprogress.DonutProgress 
      android:id="@+id/amain_dp" 
      android:layout_width="240dp" 
      android:layout_height="240dp" 
      android:layout_centerInParent="true" /> 

     <TextView 
      android:id="@+id/amain_tv_currentsteps" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:gravity="center" 
      android:textSize="25sp" /> 

     <ImageButton 
      android:id="@+id/amain_ib_whatsapp" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_marginTop="5dp" 
      android:layout_centerHorizontal="true" 
      android:layout_below="@id/amain_tv_currentsteps" 
      android:background="@drawable/whatsapp_icon"/> 

    </RelativeLayout> 

Это выход я получаю:

enter image description here

EDIT: код работает правильно, если layout_weight параметр удаляется и фиксируется обеспечивается layout_height параметр. Но хотелось бы понять, почему этот код не удается из-за layout_weight

EDIT: Полный код XML:

<ScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="in.jiyofit.basic_app.MainActivity"> 

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

    <TextView 
     android:id="@+id/amain_tv_target" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="20dp" 
     android:layout_weight="10" /> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="40"> 

     <com.github.lzyzsd.circleprogress.DonutProgress 
      android:id="@+id/amain_dp" 
      android:layout_width="240dp" 
      android:layout_height="240dp" 
      android:layout_centerInParent="true" /> 

     <TextView 
      android:id="@+id/amain_tv_currentsteps" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:gravity="center" 
      android:textSize="25sp" /> 

     <ImageButton 
      android:id="@+id/amain_ib_whatsapp" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_marginTop="5dp" 
      android:layout_centerHorizontal="true" 
      android:layout_below="@id/amain_tv_currentsteps" 
      android:background="@drawable/whatsapp_icon"/> 

    </RelativeLayout> 

    <FrameLayout 
     android:id="@+id/amain_fl_container" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="30" 
     android:layout_marginTop="20dp"/> 

</LinearLayout> 

+0

Схема выглядит отлично на моем конце. Вы сняли скриншот в редакторе макетов Android Studio? – Shaishav

+0

это с моего мобильного телефона. Добавьте другое представление с помощью 'layout_weight', которое может быть причиной. – suku

+0

мой ответ должен работать –

ответ

1

Учитывая, что ваша раскладка следующая схема:

<ScrollView> 
    <LinearLayout> 
     <TextView/> 
     <RelativeLayout/> 
     <FrameLayout/> 
    </LinearLayout> 
</ScrollView> 

В приведенной выше иерархии, все LinearLayout дети имеют вес макет набор свойств, которые в основном просить родителей, чтобы обеспечить (layout_weight/weightSum) * parentHeight() пространство к нему в пределах родителя и сам LinearLayout имеет lauout_height, установленный на wrap_content, который в основном просит детей рассказать о своих высотах, поэтому сам LinearLayout может масштабироваться соответствующим образом. Это круговая зависимость, и, следовательно, инструмент компоновки имеет проблемы с определением позиции.

В этом случае у вас есть два параметра:

1 - Снимите ScrollView и установите Linearlayout's высоту match_parent. Каждый дочерний элемент макета будет растягиваться соответствующим образом, чтобы правильно заняться экраном. Ваш макет будет выглядеть следующим образом:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:weightSum="80"> 

    <TextView 
     android:id="@+id/amain_tv_target" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_marginBottom="10dp" 
     android:layout_marginTop="20dp" 
     android:layout_weight="10"/> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="40"> 

     <com.github.lzyzsd.circleprogress.DonutProgress 
      android:id="@+id/amain_dp" 
      android:layout_width="240dp" 
      android:layout_height="240dp" 
      android:layout_centerInParent="true"/> 

     <TextView 
      android:id="@+id/amain_tv_currentsteps" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:gravity="center" 
      android:textSize="25sp"/> 

     <ImageButton 
      android:id="@+id/amain_ib_whatsapp" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:layout_below="@id/amain_tv_currentsteps" 
      android:layout_centerHorizontal="true" 
      android:layout_marginTop="5dp"/> 

    </RelativeLayout> 

    <FrameLayout 
     android:id="@+id/amain_fl_container" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_marginTop="20dp" 
     android:layout_weight="30"/> 

</LinearLayout> 

2 - Поскольку у вас есть в месте с ScrollView, вы можете обеспечить абсолютную высоту для каждого ребенка LinearLayout и пусть LinearLayout высоты будет wrap_content. ScrollView адекватно масштабирует ваш макет соответственно для разных экранов. Ваш макет может выглядеть примерно так:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:weightSum="80"> 

     <TextView 
      android:id="@+id/amain_tv_target" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="10dp" 
      android:layout_marginTop="20dp"/> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="400dp"> 

      <com.github.lzyzsd.circleprogress.DonutProgress 
       android:id="@+id/amain_dp" 
       android:layout_width="240dp" 
       android:layout_height="240dp" 
       android:layout_centerInParent="true"/> 

      <TextView 
       android:id="@+id/amain_tv_currentsteps" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_centerInParent="true" 
       android:gravity="center" 
       android:textSize="25sp"/> 

      <ImageButton 
       android:id="@+id/amain_ib_whatsapp" 
       android:layout_width="40dp" 
       android:layout_height="40dp" 
       android:layout_below="@id/amain_tv_currentsteps" 
       android:layout_centerHorizontal="true" 
       android:layout_marginTop="5dp"/> 

     </RelativeLayout> 

     <FrameLayout 
      android:id="@+id/amain_fl_container" 
      android:layout_width="match_parent" 
      android:layout_height="200dp" 
      android:layout_marginTop="20dp"/> 

    </LinearLayout> 

</ScrollView> 

Так же, как правило, убедитесь, что высота/ширина вашего LinearLayout, если определяемая, прежде чем предоставить layout_weight имущество своих детей. Надеюсь это поможет.

+0

Я думаю, 'linear_layout' должен быть' wrap_content' внутри прокрутки. Поэтому второе решение нельзя использовать, если используется 'layout_weight'. – suku

+0

@suku полностью ваш звонок – Shaishav

0

Вы должны использовать + так:

android:layout_below="@+id/amain_tv_currentsteps" 
+2

'+' необходим только тогда, когда вы используете имя представления в первый раз (во время создания или во время ссылки). – Shaishav

+0

Для меня это сделало работу –

+0

Какая работа? Я говорю, что у него не должно быть '+'. Это ничего не изменит. – Shaishav

0

в вас топ RelativeLayout дать размер ему 0dp делает проблему, потому что она (что rel имеет 0 высоту и) ваше изображение выглядит ниже i т.

android:layout_height="match_parent" 
+0

Возможно, это ребенок для LinearLayout. – Shaishav

+0

@Charuka, мне нужно использовать 'layout_weight' – suku

+0

@Shaishav, да, относительный макет - это дочерний элемент linearlayout, имеющий другие виды – suku

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