RelativeLayout utilizza lo schermo intero per wrap_content


126

Perché FOOBARZ viene disposto completamente in fondo quando nessun elemento è layout_height="fill_parent"in altre parole, tutti gli elementi sono wrap_content per l'altezza? inserisci qui la descrizione dell'immagine

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/feed_u"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:layout_marginLeft="5dip"
        android:scaleType="centerCrop"
        android:drawableTop="@android:drawable/presence_online"
        android:text="U" />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/feed_u">
        <ImageView
            android:id="@+id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_minus" />
        <ImageView
            android:id="@+id/feed_ha"
            android:layout_toLeftOf="@id/feed_h"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/btn_plus" />
        <TextView
            android:id="@+id/feed_t"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Title">
        </TextView>
        <TextView
            android:id="@+id/feed_a"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Band"
            android:layout_below="@id/feed_t">
        </TextView>
        <TextView
            android:id="@+id/feed_s"
            android:layout_below="@id/feed_a"
            android:text="S"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>
        <TextView
            android:id="@+id/feed_tm"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="FOOBARZ"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content">
        </TextView>

    </RelativeLayout>
</RelativeLayout>

1
Usa hierarchyviewero la Gerarchia Visualizza la prospettiva in Eclipse per determinare dove stanno andando le cose male: developer.android.com/guide/developing/debugging/…
CommonsWare,

Dov'è la prospettiva della vista gerarchica all'interno di Eclipse? quale schermo?
hunterp,

1
Finestra> Apri prospettiva> Altro ... - anche se penso che tu abbia già la tua risposta, per gentile concessione di @alextc.
CommonsWare,

@CommonsWare L'ho trovato, ma è vuoto, come posso effettivamente caricare un layout in esso ??
hunterp,

Risposte:


266

Dal RelativeLayoutdocumento:

Panoramica della classe

Un layout in cui le posizioni dei bambini possono essere descritte l'una rispetto all'altra o al genitore.

Si noti che non è possibile avere una dipendenza circolare tra la dimensione di RelativeLayout e la posizione dei relativi figli. Ad esempio, non è possibile avere un RelativeLayout la cui altezza è impostata su WRAP_CONTENT e un figlio impostato su ALIGN_PARENT_BOTTOM

Documentazione di classe

Qual è esattamente il tuo caso. RelativeLayout non può farlo.


3
Quindi ho rimosso align_parentBottom e il layout ora è solo 1/10 dello schermo come dovrebbe essere, come posso mettere FOOBARZ in fondo a questo?
hunterp,

2
Dando solo una breve occhiata direi: prendi la visualizzazione testuale FOOBARZ, spostala nel RelativeLayout esterno e imposta android: layout_below = "@ id / feed_u". Non sono esattamente sicuro se questo è ciò che vuoi duro.

Hai provato ad assegnare un'altezza fissa al layout relativo (es android:layout_height="200dp". Questo ti permetterebbe di usareandroid:layout_alignParentBottom="true"
gfrigon

1
Si noti che ciò può accadere anche quando si utilizza un disegno grande come sfondo. Per aggirarlo, estrai il contenuto principale in un layout figlio e trasforma lo sfondo in un fratello <ImageView>dietro di esso.
Ben Leggiero,

1
Ho notato che i bambini non sono inoltre autorizzati ad utilizzare una layout_heightdimatch_parent
Daniel F

52

Per coloro che cercano una soluzione a questo, come ho fatto io, puoi usare FrameLayoutinvece di RelativeLayout.

Quindi è possibile impostare la gravità dell'oggetto previsto in basso a destra come in basso

<TextView
    android:layout_gravity="bottom|right"
    android:text="FOOBARZ"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
</TextView>

Utilizzare FrameLayout è un'ottima soluzione. Se in questo layout sono presenti più componenti, è necessario impostare il margine per evitare sovrapposizioni.
Veronnie,

23

Hai impostato RelativeLayout su "wrap_content" e TextView su android:layout_alignParentBottom="true", quindi tenta automaticamente di allungare RelativeLayout verso il basso. Non utilizzare tali dipendenze con il layout relativo, poiché può essere considerato come "dipendenze circolari".

Dai documenti per RelativeLayout :

Si noti che non è possibile avere una dipendenza circolare tra la dimensione di RelativeLayout e la posizione dei relativi figli. Ad esempio, non è possibile avere un RelativeLayout la cui altezza è impostata su WRAP_CONTENTe un figlio impostato su ALIGN_PARENT_BOTTOM.

Prova ad allineare TextView a qualcosa di diverso da RelativeLayout principale, ma fai attenzione anche a questo problema: dipendenze circolari, hai
bisogno di aiuto con il codice esatto

In alternativa, prova ad aggiungere layout interni più sofisticati.


2
A proposito, penso in fase di esecuzione: il tuo codice verrebbe visualizzato come desideri, anche con "android: layout_alignParentBottom =" true "". Sembra che Android esegua ulteriori analisi su questo caso in fase di esecuzione e lo visualizzi correttamente. Dovresti provare a eseguire la tua app.
Dirol,

0

Buone risposte. Ora se non hai layout_alignParentBottom="true"e stai ancora android:background="@drawable/bkgnd"riscontrando questo problema, fai attenzione a dove bkgnd è un grande fan.


0

Non sono sicuro del perché il modo pulito ed ovvio per ottenere questo risultato non sia stato ancora pubblicato. Questa soluzione performante funziona con qualsiasi View MyView con un'altezza nota.

Avvolgi la tua RelativeLayoutaltezza wrap_contentin un FrameLayout:

<!-- width here should constrain RelativeLayout -->
<FrameLayout 
     android:layout_width="@dimen/my_layout_width"
     android:layout_height="wrap_content">

     <RelativeLayout  
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />

     <MyView
        ...
        android:layout_gravity="bottom" />
</FrameLayout>

Tieni presente che la vista nella parte inferiore del FrameLayout sarà in cima al tuo RelativeLayoutcontenuto, quindi dovrai aggiungere un'imbottitura nella parte inferiore di quel layout per adattarlo. Se desideri che la vista abbia un'altezza variabile, puoi o Sottoclassare FrameLayout per aggiungere il riempimento nel codice in base all'altezza della vista misurata, o semplicemente cambiare FrameLayout in LinearLayout verticale se non sei preoccupato per le prestazioni, cioè non è una visualizzazione elenco elemento o le viste sono relativamente leggere.


0

Non utilizzare le proprietà del tipo alight_Parent con le viste figlio

È possibile utilizzare il layout della cornice anziché RelayLayout con la relativa gravità

    <FrameLayout
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
     <TextView
        android:layout_gravity="bottom|right"
        android:text="Hello "
        android:layout_height="wrap_content"
        android:layout_width="wrap_content">

    </TextView>

</FrameLayout>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.