2009-12-27 15 views
7

Estoy usando TableLayout en mi aplicación. Contiene cuatro TableRows que contienen cuatro ImageViews. El comportamiento que deseo es escalar el diseño para que se ajuste a la dimensión más corta.¿Cómo puedo obtener un TableLayout de Android para llenar el elemento primario en modo horizontal?

Funciona bien en modo retrato pero falla miserablemente en modo paisaje.

Desde el documentation parece que esto es porque TableRow layout_height siempre se establece en WRAP_CONTENT. Si bien puedo establecer las dimensiones de las Vistas individuales, TableLayout no se representará en absoluto si configuro View layout_height como FILL_PARENT.

Siento que hay algo simple que me falta. ¿Hay alguna manera de escalar el TableLayout con TableRows para que se ajuste a la altura en modo horizontal?

diseño xml:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/table" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:shrinkColumns="*"> 
</TableLayout> 

Java:

public class Example extends Activity { 

private TableLayout mTable; 
private int[] mDrawableIds = { R.drawable.draw01, R.drawable.draw02, R.drawable.draw03, R.drawable.draw04, R.drawable.draw05, R.drawable.draw06, R.drawable.draw07, R.drawable.draw08, R.drawable.draw09, R.drawable.draw10, R.drawable.draw11, R.drawable.draw12, R.drawable.draw13, R.drawable.draw14, R.drawable.draw15, R.drawable.draw16 }; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mTable = (TableLayout)findViewById(R.id.table); 
    for (int j=0; j<4; j++) { 
     TableRow tr = new TableRow(this); 
     tr.setLayoutParams(new ViewGroup.LayoutParams( LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT)); 
      for (int i=0; i<4; i++) { 
       ImageView iv = new ImageView(this); 
       iv.setImageResource(mDrawableIds[j*4+i]); 
       iv.setScaleType(ImageView.ScaleType.FIT_CENTER); 
       iv.setAdjustViewBounds(true); 
       tr.addView(iv); 
      } 
     mTable.addView(tr); 
    } 
} 
} 
+0

¿No funciona un GridView para su caso de uso? Tutorial de GridView aquí: http://developer.android.com/guide/tutorials/views/hello-gridview.html –

+0

GridView parece querer desplazar en lugar de cambiar el tamaño de las ImageView por el diseño del paisaje. Quizás si reduje los recursos de la imagen que podría funcionar. Esperaba evitar cambiar el tamaño de las imágenes. –

Respuesta

4

Descubrí cómo hacerlo. Básicamente, la parte que no funcionaba como yo quería era TableRows. Cuando cambié al paisaje, los primeros dos TableRows no cambiaban de tamaño y el tercero consumía el resto del espacio. La cuarta fila no se mostraba en absoluto.

Me di cuenta de que necesitaba establecer el layout_weight de las TableRows en valores iguales. Sin embargo, no existe un método para hacer eso en tiempo de ejecución, por lo que construyó el siguiente archivo de diseño, lo que he llamado row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TableRow xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/trow" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_weight="1"> 
</TableRow> 

Luego usé un LayoutInflater para construir la fila en tiempo de ejecución con las propiedades que quería :

mTable = (TableLayout)findViewById(R.id.table); 
    LayoutInflater inflater = getLayoutInflater(); 

    for (int j=0; j<4; j++) { 
     View row = inflater.inflate(R.layout.row, mTable,false); 
     TableRow tr = (TableRow)row.findViewById(R.id.trow); 
      for (int i=0; i<4; i++) { 
       View image = inflater.inflate(R.layout.image, tr, false); 
       ImageButton ib = (ImageButton)image.findViewById(R.id.image); 
       ib.setAdjustViewBounds(true); 
       ib.setImageResource(mCardIds[j*4+i]); 
       tr.addView(ib); 
      } 
     mTable.addView(tr); 
    } 

Ahora las TableRows cambian de tamaño correctamente en la rotación. Cambié las ImageViews a ImageButtons porque decidí agregar algo del comportamiento de ClickClick y estoy construyendo esos botones a través de un archivo xml separado, pero no creo que esos detalles sean relevantes para el problema de cambio de tamaño.

+0

agregar 'android: layout_weight =" 1 "' a cada columna en la fila de encabezado de tabla resolvió mi problema, agradable – knownUnknown

4

Cambia el diseño de XML para:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/table" 
     android:layout_width="fill_parent" 
     android:layout_height="160dp" 
     android:shrinkColumns="*"> 
</TableLayout> 

Eso debería hacer más tardar hasta la altura de la pantalla completa independientemente de su orientación. Ver density independent pixels

0

He intentado la solución aceptada aquí, pero no funcionó. Lo que funcionó es el siguiente:

TableRow tr = new TableRow(this); 
TableLayout.LayoutParams pRowTop = new TableLayout.LayoutParams(
       TableLayout.LayoutParams.MATCH_PARENT, 
       TableLayout.LayoutParams.WRAP_CONTENT); 
pRowTop.weight = 1; 
mTable.addView(tr, pRowTop); 
Cuestiones relacionadas