2009-12-27 3 views
7

J'utilise un TableLayout dans mon application. Il contient quatre TableRows contenant chacun quatre ImageViews. Le comportement que je veux est de mettre à l'échelle la disposition pour s'adapter à la plus petite dimension.Comment puis-je obtenir une TableLayout Android pour remplir le parent en mode paysage?

Fonctionne très bien en mode portrait mais échoue lamentablement en mode paysage. À partir du documentation, il semble que cela soit dû au fait que TableRow layout_height est toujours défini sur WRAP_CONTENT.

Bien que je puisse définir les dimensions des vues individuelles, le TableLayout ne s'affichera pas du tout si j'ai défini View layout_height sur FILL_PARENT. Je sens qu'il y a quelque chose de simple qui me manque. Existe-t-il un moyen de mettre à l'échelle TableLayout avec TableRows pour s'adapter à la hauteur en mode paysage?

Mise en page 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

Est-ce qu'un GridView ne fonctionne pas pour votre cas d'utilisation? Didacticiel GridView ici: http://developer.android.com/guide/tutorials/views/hello-gridview.html –

+0

GridView semble vouloir faire défiler plutôt que de redimensionner les images en mode paysage. Peut-être que si je réduisais les ressources d'image, cela pourrait fonctionner. J'espérais éviter de redimensionner les images. –

Répondre

4

J'ai fait comprendre comment faire ceci. Fondamentalement, la partie qui ne fonctionnait pas comme je le souhaitais était les TableRows. Lorsque je suis passé en mode paysage, les deux premiers TableRows n'étaient pas redimensionnés et le troisième consommait le reste de l'espace. La quatrième rangée ne s'affichait pas du tout. J'ai compris que j'avais besoin de mettre le poids de la disposition des TableRows à des valeurs égales. Mais, il n'y a pas de méthode pour le faire lors de l'exécution, alors je construit le fichier de mise en page suivante, que j'ai appelé 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> 

Puis j'ai utilisé un LayoutInflater pour construire la ligne à l'exécution avec les propriétés que je voulais :

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); 
    } 

Maintenant, les TableRows sont redimensionnement correctement lors de la rotation. J'ai changé ImageViews en ImageButtons parce que j'ai décidé d'ajouter un peu de comportement onClick et je construis ces boutons via un fichier xml séparé, mais je ne pense pas que ces détails sont pertinents pour le problème du redimensionnement.

+0

ajouter 'android: layout_weight =" 1 "' à chaque colonne dans la ligne d'en-tête de table résolu mon problème, gentil – knownUnknown

4

Changer votre mise en page 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="160dp" 
     android:shrinkColumns="*"> 
</TableLayout> 

Cela devrait faire prendre jusqu'à la hauteur de tout l'écran quelle que soit l'orientation. Voir density independent pixels

0

J'ai essayé la solution acceptée ici mais cela n'a pas fonctionné. Ce qui a fonctionné est comme ci-dessous:

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); 
Questions connexes