2014-12-14 2 views
2

У меня есть RelativeLayout, который содержит 3 детей (LinearLayout):Android layout_above не работает на API 21

  • один на вершине.
  • один в нижней части.

  • и один между двумя последними видами.

код я использую для этого является:

<RelativeLayout 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:background="@color/white" 
    tools:context="fr.caudoux.onlinegames.activities.GameMainFragment"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:background="#ff44f0c3" 
     android:layout_alignParentTop="true" 
     android:id="@+id/game_main_actionbar" 
     android:layout_width="match_parent" 
     android:layout_height="50dp"> 


    </LinearLayout> 

    <LinearLayout 
     android:background="#F" 
     android:orientation="vertical" 
     android:id="@+id/game_main_top_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 

     android:layout_below="@id/game_main_actionbar" 
     android:layout_above="@+id/game_main_chat_container"> 

    </LinearLayout> 

    <LinearLayout 
     android:background="#ff2c3ff0" 
     android:layout_alignParentBottom="true" 
     android:orientation="vertical" 
     android:id="@id/game_main_chat_container" 
     android:layout_marginBottom="70dp" 
     android:layout_width="match_parent" 
     android:layout_height="50dp"> 

    </LinearLayout> 
</RelativeLayout> 

С АНИ 21 attribut «андроида: layout_above» не работает: второй LinearLayout взять все пространство ниже первого, и третий LinearLayout находится над вторым.

На api ниже 21 он работает: вторая часть занимает только пространство между первым и третьим Linlingayout.

Кто-нибудь знает, почему он не работает и что делать?

Благодаря

+0

Альтернативное решение использует линейный макет как root вместо Relative layout. Используйте свойство android: layout_weight в дочерних макетах, чтобы соответствующим образом настроить ваш макет. Надеюсь, это предложение поможет вам решить вашу проблему. – user1154390

ответ

0

Изменение заказа, чтобы ваш верхний и нижний вид объявленную перед зрения, что находится между двумя:

<RelativeLayout 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:background="@color/white" 
    tools:context="fr.caudoux.onlinegames.activities.GameMainFragment"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:background="#ff44f0c3" 
     android:layout_alignParentTop="true" 
     android:id="@+id/game_main_actionbar" 
     android:layout_width="match_parent" 
     android:layout_height="50dp"> 


    </LinearLayout> 

    <LinearLayout 
     android:background="#ff2c3ff0" 
     android:layout_alignParentBottom="true" 
     android:orientation="vertical" 
     android:id="@id/game_main_chat_container" 
     android:layout_marginBottom="70dp" 
     android:layout_width="match_parent" 
     android:layout_height="50dp"> 

    </LinearLayout> 

    <LinearLayout 
     android:background="#F" 
     android:orientation="vertical" 
     android:id="@+id/game_main_top_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 

     android:layout_below="@id/game_main_actionbar" 
     android:layout_above="@+id/game_main_chat_container"> 

    </LinearLayout> 
</RelativeLayout> 

Как уже упоминалось, эта же раскладка проще сделать как 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:background="@color/white" 
    android:orientation="vertical" 
    tools:context="fr.caudoux.onlinegames.activities.GameMainFragment"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:background="#ff44f0c3" 
     android:id="@+id/game_main_actionbar" 
     android:layout_width="match_parent" 
     android:layout_height="50dp"> 


    </LinearLayout> 

    <LinearLayout 
     android:background="#F" 
     android:orientation="vertical" 
     android:id="@+id/game_main_top_container" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 

    </LinearLayout> 

    <LinearLayout 
     android:background="#ff2c3ff0" 
     android:orientation="vertical" 
     android:id="@id/game_main_chat_container" 
     android:layout_marginBottom="70dp" 
     android:layout_width="match_parent" 
     android:layout_height="50dp"> 

    </LinearLayout> 
</LinearLayout> 

Обратите внимание, как только средний элемент (элемент, который необходимо заполнить оставшееся пространство) имеет layout_weight на нем. Это гарантирует, что все оставшееся пространство будет выделено для этого вида, в то время как другие представления имеют фиксированную высоту.

+0

Эти два метода очень полезны. большое спасибо ! – jeromeC

0

Вы не можете быть как выше, так и ниже установленного в одном представлении. Используйте ниже на втором экране, а затем снова на последнем экране.

+0

Я только что попробовал. Последний вид не отображается на экране, потому что второй вид занимает все свободное пространство. – jeromeC

+0

Что делать, если вы меняете высоту, чтобы обернуть содержимое на втором представлении? – Mazur

+0

Тогда второй вид не занимает все свободное пространство. и если задана высота в dp, слишком большая для размера экрана, то последний вид также исчезает под экраном. – jeromeC

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