5

Sto creando un layout (file XML) in Android che ha due visualizzazioni figlio (una sul lato destro dello schermo e una a sinistra). Voglio che la vista a destra occupi uno spazio predeterminato (in dp) e che la vista a sinistra occupi tutto lo spazio rimanente fino a un limite, a quel punto smetterà di espandersi e i due layout saranno solo allontanarsi ulteriormente mentre lo schermo si ingrandisce.Layout Android con vista a destra che occupa uno spazio preimpostato e visualizza a sinistra le scale per riempire il resto dello schermo fino a un certo limite

La cosa strana è che sarebbe molto facile se volessi che la vista sul lato destro fosse quella che si espande, e la vista a sinistra sia quella che occupa uno spazio preimpostato. Se imposti ciascuna visualizzazione sulla larghezza desiderata (in un layout lineare orizzontale), Android ridurrà automaticamente quello a sinistra nel caso in cui entrambe le viste non si adattino.

Mi piacerebbe farlo in un file di layout; questo layout è già progettato per display tra sw512dp-land e sw765dp-land.

Il codice seguente funzionerebbe se riuscissi a trovare un modo per rendere Android restringente il layout a sinistra (quando i layout non possono adattarsi alla dimensione specificata). Ma di default il sistema ridurrà prima il layout sulla destra.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" > 

<RelativeLayout 
    android:id="@+id/left" 
    android:layout_width="150dip" 
    android:layout_height="fill_parent" 
    android:background="@color/red" > 
</RelativeLayout> 

<LinearLayout 
    android:id="@+id/right" 
    android:layout_width="100dip" 
    android:layout_height="fill_parent" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:background="@color/green" > 
</LinearLayout> 

Questo codice (da @Lokesh) potrebbe funzionare se non ho bisogno il layout a sinistra per fermare l'espansione ad un certo punto.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" > 

<LinearLayout 
    android:id="@+id/left" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_toLeftOf="@+id/right" 
    android:background="@color/red" > 

</LinearLayout> 

<LinearLayout 
    android:id="@+id/right" 
    android:layout_width="100dip" 
    android:layout_height="fill_parent" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:background="@color/green" > 
</LinearLayout> 

Sarebbe anche bello sapere se qualcuno pensa che questo non è possibile in modo da poter ricorrere a farlo pragmaticamente o cambiare il mio approccio al layout.

Grazie!

+0

Quali sono esattamente queste * viste * di cui stai parlando? Intendo layout o widget? –

+0

Prova a postare il codice – Chaitanya

+0

Questo dovrebbe essere facile da fare ma dipende da cosa intendi con * occupare tutto lo spazio rimanente fino a un limite *. – Luksprog

risposta

3

Questo funziona per me. Ho impostato il layout corretto su 100dip, modificato in base alle esigenze.

<?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="fill_parent" 
    android:orientation="horizontal" > 

    <LinearLayout 
     android:id="@+id/left" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_toLeftOf="@+id/right" 
     android:background="@color/red" > 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/right" 
     android:layout_width="100dip" 
     android:layout_height="fill_parent" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:background="@color/green" > 
    </LinearLayout> 

</RelativeLayout> 

EDIT 1: Ho usato il colore di sfondo solo per mostrare chiaramente i layout. Non è necessario affatto. :)

EDIT 2: Se si desidera un modo per espandere il layout sinistra fino a solo un limite quindi provare questo -

<?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="fill_parent" 
    android:orientation="horizontal" > 

    <LinearLayout 
     android:id="@+id/left" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_toLeftOf="@+id/right"> 
     <LinearLayout 
          android:id="@+id/inner" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent"   
      android:background="@color/yellow"> 

      <TextView 
       android:id="@+id/myTextView" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="This will expand only to a limit" 
       android:maxWidth="300dip" 
       android:textAppearance="?android:attr/textAppearanceLarge" 
       android:background="@color/red" /> 

     </LinearLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/right" 
     android:layout_width="100dip" 
     android:layout_height="fill_parent" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:background="@color/green" > 
    </LinearLayout> 

</RelativeLayout> 

Qui è necessario posizionare i widget in inner layout e questo è ciò che sembra in diversi schermi.

3.1in HVGA 3.2in HVGA

5.2in QVGA 5.2in QVGA

Colori usati: rosso (# FFFF00), giallo (# FFFFFF00), verde (# FF00FF00).

+0

Grazie, ho aggiunto questo e un altro esempio con gli stessi ID di layout al post principale come riferimento. Il problema con questo è il layout a sinistra non smetterà mai di espandersi man mano che lo schermo si ingrandisce. Se al layout di sinistra viene assegnato un valore di immersione, quando smette di espandersi si sposterà dal lato sinistro dello schermo anziché da uno spazio tra i due layout. – zjuhasz

+0

Non sono sicuro di poter ottenere ciò che vuoi direttamente, ma se metti alcuni 'Widget' nel tuo layout questo può essere ottenuto posizionando un Layout interno all'interno della sinistra con' wrap_content' e poi posizionando il 'Widget' con' 'Android: maxWidth'. Aspetta che modificherò la mia risposta. –

+0

Intelligente, lavora per me, grazie mille! – zjuhasz