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

je me bats avec L'horrible système de mise en page D'Android. J'essaie d'avoir une table pour remplir l'écran (simple droite?) mais il est incroyablement difficile.

Je l'ai obtenu pour fonctionner en quelque sorte dans 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);
    }

évidemment, la documentation Android n'est d'aucune aide. N'importe qui ont des idées?

28
demandé sur Chris Martin 2010-03-06 22:39:23

5 réponses

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

  1. il est possible de programmer le poids en spécifiant TableLayout.LayoutParams et TableRow.LayoutParams et en utilisant le constructeur approprié, p.ex.

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

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 Android developer's forum pour la solution .

35
répondu Martin 2018-08-09 00:05:15

a finalement trouvé comment faire. Abandonné sur TableLayout et juste utilisé horizontal LinearLayout s à l'intérieur d'un vertical. L'essentiel est de mettre 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
répondu Timmmm 2018-08-08 23:30:09

a trouvé la réponse: apparemment c'est layout_weight qui le fait fonctionner et il n'y a aucun moyen de le configurer à partir de Java. Merde.

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

1
répondu Timmmm 2017-05-23 12:18:04

vous ne définissez jamais les paramètres de mise en page des lignes ou des boutons alors que dans le xml affiché vous le faites..modifiez les détails des boucles for pour régler les paramètres de la ligne et les paramètres du bouton layout.cela devrait donner le même résultat que votre xml.

0
répondu Fred Grott 2010-03-06 20:35:45

pour définir TableLayout LayoutParams, nous nous attendons logiquement à utiliser TableLayout.LayoutParams classe, mais vous obtiendrez une erreur de moulage indiquant que TableLayout.LayoutParams ne peut pas être moulé dans FrameLayout.LayoutParams.

donc, vous devez utiliser FrameLayout.LayoutParams, si vous voulez programmer les propriétés 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
répondu Mohammed Mukhtar 2016-11-04 09:07:04