web-dev-qa-db-fra.com

Comment puis-je obtenir un Android TableLayout pour remplir l'écran?

Je me bats avec le système de mise en page terrible d'Android. J'essaie d'obtenir un tableau pour remplir l'écran (simple, non?) Mais c'est ridiculement difficile.

Je l'ai obtenu en quelque sorte en XML comme ceci:

<?xml version="1.0" encoding="utf-8"?>

<TableLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_height="fill_parent" Android:layout_width="fill_parent">
<TableRow Android:layout_height="fill_parent" Android:layout_width="fill_parent" Android:layout_weight="1">
<Button Android:text="A" Android:layout_width="wrap_content" Android:layout_height="fill_parent" Android:layout_weight="1"/>
<Button Android:text="B" Android:layout_width="wrap_content" Android:layout_height="fill_parent" Android:layout_weight="1"/>
</TableRow>
<TableRow Android:layout_height="fill_parent" Android:layout_width="fill_parent" Android:layout_weight="1">
<Button Android:text="C" Android:layout_width="wrap_content" Android:layout_height="fill_parent" Android:layout_weight="1"/>
<Button Android:text="D" Android:layout_width="wrap_content" Android:layout_height="fill_parent" Android:layout_weight="1"/>
</TableRow>

Cependant, je ne peux pas le faire fonctionner en Java. J'ai essayé un million de combinaisons de LayoutParams, mais rien ne fonctionne jamais. C'est le meilleur résultat que j'ai qui ne remplit que la largeur de l'écran, pas la hauteur:

    table = new TableLayout(this);
    // Java. You suck.
    TableLayout.LayoutParams lp = new TableLayout.LayoutParams(
                                    ViewGroup.LayoutParams.FILL_PARENT,
                                    ViewGroup.LayoutParams.FILL_PARENT);
    table.setLayoutParams(lp); // This line has no effect! WHYYYY?!
    table.setStretchAllColumns(true);
    for (int r = 0; r < 2; ++r)
    {
        TableRow row = new TableRow(this);
        for (int c = 0; c < 2; ++c)
        {
            Button btn = new Button(this);
            btn.setText("A");
            row.addView(btn);
        }
        table.addView(row);
    }

De toute évidence, la documentation Android n'est d'aucune aide. Quelqu'un a des idées?

28
Timmmm

Enfin travaillé comment faire cela. Abandonné le TableLayout et juste utilisé un LinearLayouts horizontal dans un vertical. La clé est de définir le poids. Si vous spécifiez FILL_PARENT mais avec le poids par défaut, cela ne fonctionne pas:

LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r)
{
    LinearLayout row = new LinearLayout(this);
    row.setOrientation(LinearLayout.HORIZONTAL);
    for (int c = 0; c < 4; ++c)
    {
        Button btn = new Button(this);
        btn.setText("A");
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
        lp.weight = 1.0f;
        row.addView(btn, lp);
    }
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
    lp.weight = 1.0f;
    buttonsView.addView(row, lp);
}  

ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);
8
Timmmm

Il y a deux erreurs dans la discussion ci-dessus.

  1. Il est possible de définir le poids par programmation en spécifiant TableLayout.LayoutParams et TableRow.LayoutParams et en utilisant le constructeur approprié, par exemple. 

    TableLayout.LayoutParams rowInTableLp = new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);
    
  2. Un widget doit avoir la LayoutParams de son parent. Par conséquent, les lignes doivent utiliser TableLayout.LayoutParams.

Cela vous donne la version de travail suivante de votre code initial:

TableLayout table = new TableLayout(this);
// Java. You succeed!
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
        ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.FILL_PARENT);
table.setLayoutParams(lp);
table.setStretchAllColumns(true);

TableLayout.LayoutParams rowLp = new TableLayout.LayoutParams(
        ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.FILL_PARENT,
        1.0f);
TableRow.LayoutParams cellLp = new TableRow.LayoutParams(
        ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.FILL_PARENT,
        1.0f);
for (int r = 0; r < 2; ++r)
{
    TableRow row = new TableRow(this);
    for (int c = 0; c < 2; ++c)
    {
        Button btn = new Button(this);
        btn.setText("A");
        row.addView(btn, cellLp);
    }
    table.addView(row, rowLp);
}
setContentView(table);

Merci au commentaire de Romain Guy sur le forum du développeur Android pour la solution .

35
Martin

Nous avons trouvé la réponse: apparemment, c'est le poids layout_weight qui le fait fonctionner et il n'y a aucun moyen de le définir à partir de Java. Bon sang.

Voir Comment puis-je obtenir une TableLayout Android pour remplir le parent en mode paysage?

1
Timmmm

Vous ne définissez jamais les paramètres de disposition des lignes ou des boutons, alors que vous le faites dans le XML posté. Modifiez les détails des boucles for pour définir les paramètres de disposition des lignes et les paramètres de disposition des boutons de manière à obtenir le même résultat que votre XML.

0
Fred Grott

Pour définir TableLayout LayoutParams, nous nous attendons logiquement à utiliser la classe TableLayout.LayoutParams, mais vous obtiendrez une erreur de conversion indiquant que TableLayout.LayoutParams ne peut pas être transformé en FrameLayout.LayoutParams. 

Vous devez donc utiliser FrameLayout.LayoutParams, si vous souhaitez définir par programme les propriétés de TableLayout. Par exemple:

FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT,TableLayout.LayoutParams.MATCH_PARENT);
            layoutParams.setMargins(80, 0, 0, 0);
            TableLayout tableLayout = (TableLayout) findViewById(R.id.header_detail);
            tableLayout.setLayoutParams(layoutParams);
0
Mohammed Mukhtar