web-dev-qa-db-fra.com

Disposition du tableau XML? Deux rangées de largeur égale remplies de boutons de largeur égale?

Voici une partie de mon format XML for LAND:

<TableLayout
    Android:layout_height="wrap_content"
    Android:layout_width="wrap_content"
    Android:layout_gravity="center"
    Android:stretchColumns="*">
<TableRow>    
    <Button
        Android:id="@+id/countbutton"
        Android:text="@string/plus1"/>      
    <Button
        Android:id="@+id/resetbutton"
        Android:text="@string/reset" 
        />  
</TableRow>
</TableLayout>

Et maintenant, ce que je ne comprends pas - la LARGEUR d’une rangée et du bouton dépend du TEXTE à l’intérieur du bouton. Si les deux textes ont la même longueur, disons: TEXT c'est bon - la moitié du tableau est au milieu de l'écran. Mais s'ils ont une taille différente - disons "A" et "CECI IS LE BOUTON LONG", le CENTRE de la table n'est plus au milieu de l'écran et les boutons ne sont donc pas également larges ...

36
Oliver Goossens

Pour avoir des boutons en rangées où les boutons ont la même taille, vous devez le faire.

    <LinearLayout Android:orientation="horizontal" 
         Android:layout_width="fill_parent"
         Android:layout_height="fill_parent">
         <Button Android:layout_weight="1" 
             Android:layout_height="wrap_content" 
             Android:layout_width="0dip"/>
         <Button Android:layout_weight="1" 
             Android:layout_height="wrap_content" 
             Android:layout_width="0dip"/>
    </LinearLayout>

Et remplissez les autres propriétés XML pour vos boutons.

La magie réside dans les propriétés layout_weight et width. Vous n'avez pas besoin de la disposition de la table. Ces propriétés indiquent à la présentation que vos vues doivent occuper un espace égal dans la présentation parent.

89
Robby Pond

Bel exemple (originellement de http://androidadvice.blogspot.com/2010/10/tablelayout-columns-equal-width.html )

Testé et fonctionnel:

<TableRow>
  <!-- Column 1 -->
  <TextView
     Android:id="@+id/tbl_txt1"
     Android:layout_width="0dip"
     Android:layout_height="wrap_content"
     Android:background="@color/red"
     Android:textColor="@color/white"
     Android:padding="10dip"
     Android:layout_margin="4dip"
     Android:layout_weight="1"
     Android:text="Column 1" />

  <!-- Column 2 -->
  <TextView
     Android:id="@+id/tbl_txt2"
     Android:layout_width="0dip"
     Android:layout_height="wrap_content"
     Android:background="@color/red"
     Android:textColor="@color/white"
     Android:padding="10dip"
     Android:layout_margin="4dip"
     Android:layout_weight="1"
     Android:text="Column 2" />

  <!-- Column 3 -->
  <TextView
     Android:id="@+id/tbl_txt3"
     Android:layout_width="0dip"
     Android:layout_height="wrap_content"
     Android:background="@color/red"
     Android:textColor="@color/white"
     Android:padding="10dip"
     Android:layout_margin="4dip"
     Android:layout_weight="1"
     Android:text="Column 3" />
</TableRow>

4
Uros Majeric

En plus de la réponse acceptée:

J'ai eu un problème similaire où j'avais besoin de plusieurs images dans une grille avec des largeurs de colonne égales, alors j'ai utilisé une disposition de tableau. Cela fonctionnait, mais comme les images étaient chargées de manière asynchrone, les colonnes correspondantes occuperaient toute la largeur jusqu'à ce que toutes les colonnes contiennent au moins une image.

J'ai résolu ce problème en utilisant la solution de Robby Pond, mais cela n'a pas fonctionné pour la dernière ligne, qui ne contenait pas nécessairement autant d'images que les autres lignes. mêmes colonnes que ci-dessus. Pour lutter contre cela, j'ai rempli les colonnes vides restantes de cette ligne avec des objets View normaux, 

en utilisant les mêmes paramètres de mise en page que toutes les autres images: 

width = 0, weight = 1. Et ça l'a résolu!

2
may5694

L'extrait de mise en page

<TableLayout
    Android:id="@+id/tablelayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

Le code qui définit par programme les propriétés de disposition des boutons dans la table:

public void addButtons(View view) {
    TableLayout tableLayout = (TableLayout) findViewById(R.id.tablelayout);
    Context context = getApplicationContext();
    tableLayout.removeAllViews();

    for (int rowIndex = 0; rowIndex < ROWS; rowIndex++) {
        TableRow row = new TableRow(context);
        for (int columnIndex = 0; columnIndex < COLUMNS; columnIndex++) {
            Button btn = new Button(context);
            LayoutParams buttonParams = new LayoutParams(0,
                    LayoutParams.WRAP_CONTENT, 1f);
            btn.setLayoutParams(buttonParams);
            row.addView(btn);
        }
        tableLayout.addView(row);
    }
}
0
npeder

Essayez ceci: Testé et fonctionnel:

1) Pour tablelayout set Android: stretchColumns = "1"  

2) Définissez également chaque élément (colonne) layout_width = "0dip" et layout_weight = "1"

3) Et ne définissez pas layout_width of tablerow

        <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            xmlns:tools="http://schemas.Android.com/tools" Android:layout_width="match_parent"
            Android:layout_height="match_parent" Android:paddingLeft="@dimen/activity_horizontal_margin"
            Android:paddingRight="@dimen/activity_horizontal_margin"
            Android:paddingTop="@dimen/activity_vertical_margin"
            Android:paddingBottom="@dimen/activity_vertical_margin"
            tools:context="inext.smartshop.CustomerProfile.CustomerProfileView">


        <RelativeLayout
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content">


            <TableLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/tablelayout"
            Android:stretchColumns="1"
            Android:layout_above="@+id/userProfilebtnsignout"
            Android:layout_alignParentLeft="true"
            Android:layout_alignParentStart="true"
            Android:layout_alignParentRight="true"
            Android:layout_alignParentEnd="true"
            Android:layout_below="@+id/relativeLayout">

            <TableRow

                Android:layout_height="fill_parent"
                Android:padding="5dp"
                Android:id="@+id/detailsTableRow"
                Android:gravity="center_horizontal">

                <TextView

                Android:layout_height="wrap_content"
                Android:textAppearance="?android:attr/textAppearanceSmall"
                Android:text="Full Name :  "
                Android:layout_width="0dip"
                Android:layout_weight="1"
                Android:id="@+id/textView8"
                Android:gravity="right" />

                <TextView
                Android:layout_width="0dip"
                Android:layout_weight="1"
                Android:layout_height="wrap_content"
                Android:textAppearance="?android:attr/textAppearanceSmall"
                Android:text="Ram Chhabra"

                Android:id="@+id/userProfilename"

                Android:gravity="left" />

            </TableRow>

            <TableRow Android:padding="5dp"

                Android:layout_height="wrap_content">

                <TextView
                Android:layout_width="0dip"
                Android:layout_weight="1"
                Android:layout_height="wrap_content"
                Android:textAppearance="?android:attr/textAppearanceSmall"
                Android:text="Email Address :  "

                Android:id="@+id/textView10"
                Android:gravity="right" />

                <TextView
                Android:layout_width="0dip"
                Android:layout_weight="1"
                Android:layout_height="wrap_content"
                Android:textAppearance="?android:attr/textAppearanceSmall"
                Android:text="[email protected]"
                Android:id="@+id/userProfileemail"
                Android:gravity="left"
                 />
            </TableRow>

            <TableRow Android:padding="5dp">

                <TextView
                Android:layout_width="0dip"
                Android:layout_weight="1"
                Android:layout_height="wrap_content"
                Android:textAppearance="?android:attr/textAppearanceSmall"
                Android:text="Contact No 1 :  "
                Android:id="@+id/textView12"

                Android:gravity="right" />

                <TextView
                Android:layout_width="0dip"
                Android:layout_weight="1"
                Android:layout_height="wrap_content"
                Android:textAppearance="?android:attr/textAppearanceSmall"
                Android:text="8130032232"
                Android:id="@+id/userProfilecontactone"
                 />
            </TableRow>



            </TableLayout>

        </RelativeLayout>

        </RelativeLayout>
0
Ram Chhabra