2010-11-30 1 views
16

Come posso ottenere un LinearLayout (o qualsiasi altro ViewGroup) per assumere la dimensione delle sue viste figlio piuttosto che assumere la dimensione dell'immagine di sfondo?Come racchiudere le viste del contenuto anziché il background drawable?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/large_image300x300pix"> 

<TextView android:id="@+id/TextView01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Hello world!"/> 
</LinearLayout> 

Il layout lineare assume le stesse dimensioni dell'immagine di sfondo. Come posso ottenere che il layout lineare assuma le stesse dimensioni del textview?

risposta

0

Se l'immagine si presta a essere convertita in un'immagine scalabile a 9 patch, facendo ciò si ridurrebbe lo sfondo attorno a TextView.

+0

Sì, sfortunatamente la mia immagine non viene visualizzata e non è adatta per 9 patch. – Petrus

+0

Non sono sicuro che sia corretto ... Sto ancora vedendo questo stesso problema accadere quando si usano 9 patch. Le 9 patch si espandono ma non sembrano ridursi. – greg7gkb

3

È possibile creare un FrameLayout e inserire un ImageView e il LinearLayout lì. Quindi sarai in grado di configurare il layout della tua immagine di sfondo.

+2

In ImageView, ho impostato sia width che height per match_parent, Scale Tpye per adattarloXY e abilitato adjustViewBounds. Lavori! – sulai

0

Credo che la soluzione migliore qui sia quella di impostare android: clipToPadding = "true". Ciò che fa è escludere il padding per il layout principale e avvolge il tuo layout ai suoi figli.

18

OK, quindi questa discussione è un po 'vecchia, ma ho una soluzione che qualcuno potrebbe trovare utile un giorno. Penso che Android abbia problemi nel ridimensionare le immagini di grandi dimensioni, quindi la dimensione di LinearLayout finisce per essere colpita dalla bitmap drawable dello sfondo e ImageView finisce per forzare la dimensione del contenitore principale.

A meno che non si utilizzi un layout relativo. È possibile rendere ImageView in relazione alla posizione del LinearLayout, anche quando ImageView si trova dietro il layout nel genitore. La mia soluzione è simile a questa:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
<ImageView 
    android:src="@drawable/activation_popup" 
    android:scaleType="fitXY" 
    android:layout_width="0dp" 
    android:layout_height="0dp" 
    android:layout_alignTop="@+id/activation_layout" 
    android:layout_alignBottom="@id/activation_layout" 
    android:layout_alignLeft="@id/activation_layout" 
    android:layout_alignRight="@id/activation_layout" 
    android:contentDescription="@string/act_code_label" /> 
<LinearLayout 
    android:id="@id/activation_layout" 
    android:clipToPadding="true" 
    android:padding="25dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 
    <!-- LinearLayout wraps a bunch of smallish views here --> 
</LinearLayout> 
</RelativeLayout> 

Ho provato questo su una parte superiore delle dimensioni del display e delle versioni del sistema operativo, sembra funzionare benissimo. Nota che il padding nel LinearLayout è un trucco per creare uno spazio per un bordo ombreggiato nel grafico dell'immagine di sfondo. LinearLayout non ha bisogno di alcun posizionamento relativo perché si presume in alto a sinistra.

+0

Ho provato il codice ... ma comprime le dimensioni dell'immagine –

+0

Questa era l'UNICA soluzione che ha funzionato per me dopo ore di ricerca. Grazie. – wapples

+0

a seconda delle tue intenzioni per lo sfondo, tuttavia, potrebbe essere importante usare 'scaleType =" centerCrop "' invece di 'fitXY'. fitXY estenderà/restringe l'immagine in modo che corrisponda esattamente alla dimensione dell'immagine risultante, indipendentemente da quanto alta o magra. 'centerCrop' ridimensiona l'immagine in modo che si adatti alle dimensioni della visualizzazione, ma * salva il rapporto *, se è importante per te. – mix3d

1

Ciò si verifica perché la vista Android calcola le dimensioni minime in base alle dimensioni selezionabili dello sfondo.

Controllare my answer here in questo altro post che copre lo stesso problema che consente di ottenere la configurazione del layout.