2012-01-15 21 views
20

Dopo un sacco di googling non riesco a trovare una soluzione a questo problema. Ho questo layout:come impostare la larghezza massima per un layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/adlayout" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical"> 
<TableLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:stretchColumns="1" 
    android:layout_weight="1" 
    > 

    <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent" android:layout_height="wrap_content"> 
     <TextView android:padding="6dip" android:text="@string/barcode_format" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 
     <EditText android:padding="6dip" android:layout_width="fill_parent" android:id="@+id/edit_barcode_format" android:layout_height="wrap_content"></EditText> 
    </TableRow> 
    <TableRow android:id="@+id/tableRow1" android:layout_width="fill_parent" android:layout_height="wrap_content"> 
     <TextView android:padding="6dip" android:text="@string/barcode_type" android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> 
     <EditText android:padding="6dip" android:layout_width="fill_parent" android:id="@+id/edit_barcode_type" android:layout_height="wrap_content"></EditText> 
    </TableRow>   
</TableLayout> 


</LinearLayout> 

Il layout tabella definisce un modulo. Su un telefono sembra ok ma su un tablet, le viste di edittext sembrano troppo grandi. Voglio impostare una larghezza massima per il layout e dipingere il modulo centrato.

risposta

12

Il modo appropriato per gestire la situazione è creare un file di layout separato per ottimizzare la vista modulo per i tablet durante l'utilizzo del file esistente per i telefoni. A tale scopo, crea directory di res/layout separate con qualificatori per le dimensioni dello schermo e/o la risoluzione ad esse associate.

È possibile leggere ulteriori informazioni sui qualificatori di risorse disponibili here. Ci sono una serie di scelte qui e lascerò a voi di scegliere il meglio per la vostra applicazione, ma qui è un semplice esempio:

Supponiamo che il file di layout corrente è form.xml.

Inserire il file di layout esistente in res/layout/form.xml. Questo lo renderà il layout predefinito.

Creare un altro file e posizionarlo in res/layout-large/form.xml. Questo file di layout verrà utilizzato su dispositivi con una dimensione fisica dello schermo> ~ 5 "(tutti i tablet standard) .Per gestire il problema, ho modificato il layout predefinito per visualizzare il modulo centrato orizzontalmente e occupare solo il 60% della larghezza dello schermo :.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/adlayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:gravity="center_horizontal" 
    android:weightSum="1" > 

    <TableLayout 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.6" 
     android:stretchColumns="1" > 

     <TableRow android:id="@+id/tableRow1"> 

      <TextView 
       android:id="@+id/textView1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:padding="6dip" 
       android:text="Barcode Format" > 
      </TextView> 

      <EditText 
       android:id="@+id/edit_barcode_format" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:padding="6dip" > 
      </EditText> 
     </TableRow> 

     <TableRow android:id="@+id/tableRow1"> 

      <TextView 
       android:id="@+id/textView2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:padding="6dip" 
       android:text="Barcode Type" > 
      </TextView> 

      <EditText 
       android:id="@+id/edit_barcode_type" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:padding="6dip" > 
      </EditText> 
     </TableRow> 
    </TableLayout> 

</LinearLayout> 

la modifica utilizza le layout_weight e weightSum proprietà di LinearLayout, che raccontano la tavola per riempire solo il 60% (layout_weight=0.6) del suo genitore Questo è più efficiente che cercare di impostare una larghezza massima, soprattutto quando i dispositivi avere risoluzioni e proporzioni variabili.

FYI, ho anche provato a rimuovere il maggior numero di attributi non necessari che nel tuo XML non facevano altro che creare clutter (come più dichiarazioni xmlns:android). Una di queste modifiche era la rimozione dei parametri aggiuntivi layout_ dai bambini TableLayout, perché TableLayout ignora comunque tutti questi parametri e costringe i suoi figli a utilizzare determinati vincoli. Da Docs:

I figli di un TableLayout non possono specificare l'attributo layout_width. La larghezza è sempre MATCH_PARENT. Tuttavia, l'attributo layout_height può essere definito da un bambino; il valore predefinito è WRAP_CONTENT. Se il figlio è un TableRow, l'altezza è sempre WRAP_CONTENT.

Ulteriori informazioni su TableLayoutin the SDK docs.

HTH

+0

Grandi risposte. Molte grazie!!! – MaikoMobile

+0

Ottima soluzione! –

1

È necessario creare un nuovo ViewGroup che si estende da LinearLayout e lo limita per la larghezza che si desidera. Vedi this answer.

+1

Grazie, ma stavo cercando una soluzione XML. – MaikoMobile

34

Mantenere diversi file di layout come suggerito @Devunwired è corretto, tuttavia, aggiunge complessità al progetto (che avrebbe dovuto gestire più file nel caso in cui il progettista ridisegna il layout di visualizzazione).

Se tutto ciò che serve è modificare la larghezza di un pulsante, suggerirei quanto segue. Mantenere un file xml nella cartella layout e dare un valore di

<LinearLayout 
    style="@style/width_match_parent_max_200" 
    android:layout_height="wrap_content"> 

valori-w600dp/styles.xml contiene

<resources> 
    <style name="width_match_parent_max_200"> 
     <item name="android:layout_width">200dp</item> 
    </style> 
</resources> 

valori/styles.xml contiene

<resources> 
    <style name="width_match_parent_max_200"> 
     <item name="android:layout_width">match_parent</item> 
    </style> 
</resources> 

Edit Nota che la cartella è valori-w600dp e non valori-600dp

+0

Ricorda che 'LinearyLayout' ** NON ** avrà' android: layout_width = "wrap_content" 'Ho fatto questo errore e ho pensato che fosse necessario, ma non è affatto necessario –

+0

Bella soluzione, anche se è valori- ** ** w 600dp. –

Problemi correlati