2011-05-11 14 views
20

Czy ktoś może mi wyjaśnić, dlaczego ImageView nie pojawia się powyżej LinearLayout?Korzystanie z layout_above w RelativeLayout

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <LinearLayout 
     android:id="@+id/rev_main" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
     <!-- some stuff in here --> 
    </LinearLayout> 
    <ImageView 
     android:id="@+id/rev_arrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/arrow" 
     android:layout_above="@id/rev_main" 
     /> 
</RelativeLayout> 

Nie rozumiem.

+0

nie wydaje się gdziekolwiek? nigdzie w ogóle? może opublikujesz zdjęcie, jak będzie wyglądało i łatwiej będzie powiedzieć dlaczego. W moich układach używam identyfikatorów takich jak "@ + id/rev_main" Nawet w atrybutach takich jak layout_above. Prawdę mówiąc, choć nie jestem nawet pewna różnicy między tymi dwoma, być może spróbuj tego? – FoamyGuy

+0

To znika. Jeśli zadeklaruję ImageView jako pierwszy i spróbuję uczynić pozycję LinearLayout samą nad ImageView, zniknie również LinearLayout. – Andrew

+1

To błąd, prawda? – Price

Odpowiedz

22

Dzieje się tak, gdy podasz wyrównania względem innego układu. Rozwiązaniem, które znalazłem, było pójście w przeciwnym kierunku.

Zamiast mówić ImageView, aby był powyżej LinearLayout, powiedz LinearLayout, aby był poniżej ImageView.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <LinearLayout 
     android:id="@+id/rev_main" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/rev_arrow"> 
     <!-- some stuff in here --> 
    </LinearLayout> 
    <ImageView 
     android:id="@+id/rev_arrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/arrow" 
     /> 
</RelativeLayout> 
+1

Oto mój problem z tym: Drawable użyte do zmiany ImageView. Co oznacza, że ​​potrzebuję zmiennej dla niego w kodzie. Pozycja (powyżej lub poniżej) LinearLayout również się zmienia. Jeśli potrzebuję edytować LayoutParams dla LinearLayout, to znaczy, że potrzebuję również zmiennej dla LinearLayout. Miałem nadzieję, że potrzebuję tylko zmiennej dla ImageView. – Andrew

+1

Cóż, zmienne są tanie. Alternatywnie możesz utworzyć dwa widoki obrazu, 1 powyżej i 1 poniżej, i ustawić początkowy stan na android: visibility = "gone". Następnie można programowo zmienić stan widoczności każdego widoku w zależności od potrzeb. –

+0

Czy nie trzeba również przenosić obrazka rev_arrow ImageView powyżej LinearLayout w xml? W przeciwnym razie pojawi się błąd referencyjny, ponieważ plik jest przetwarzany liniowo. Właśnie wpadłem na ten problem. :-P – stuckj

7

Poniższy powinny pracować dla Ciebie:

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/rev_arrow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/arrow" 
     android:layout_alignParentTop="true" 
     /> 
    <LinearLayout 
     android:id="@+id/rev_main" 
     android:layout_width="fill_parent" 
     android:layout_below="@id/rev_arrow" 
     android:layout_height="wrap_content"> 
     <!-- some stuff in here --> 
    </LinearLayout> 
</RelativeLayout> 
+2

Mam z tym problem. Czasami chcę LinearLayout powyżej ImageView. Kiedy zmienię atrybut na LinearLayout na layout_above, LinearLayout zniknie całkowicie. – Andrew

1

Miałem podobny problem, tworząc niestandardowe menu opcji. Najprostszym sposobem ustawienia kolejności z widoków było wykonanie programowe. Jeśli chcesz zmienić kolejność czasem powinno Twój łatwo zadzwonić:

Nie wiem, czy to jest adaptacja do aplikacji, ale w moim przypadku to działa idealnie. Jeśli potrzebujesz więcej kodu, daj mi znać.

0

Jeśli masz taki problem w ListView, upewnij się, że używasz odpowiedniej metody inflacji. W celu prawidłowej inflacji należy określić grupę widoku rodzica.

mLayoutInflater.inflate(R.layout.listitem, parent, false); 

Nie używaj

mLayoutInflater.inflate(R.layout.listitem, null); 
Powiązane problemy