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?
5 réponses
Il y a deux erreurs dans la discussion ci-dessus.
-
il est possible de programmer le poids en spécifiant
TableLayout.LayoutParams
etTableRow.LayoutParams
et en utilisant le constructeur approprié, p.ex.TableLayout.LayoutParams rowInTableLp = new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);
-
un widget doit avoir le
LayoutParams
de son parent. Par conséquent, les lignes doivent utiliserTableLayout.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 .
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);
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?
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.
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);