2010-12-01 23 views
24

Je ne parviens pas à placer ma TableLayout à l'intérieur de l'écran when the text cell is large, malgré le texte inside the cell.Problèmes de mise en page de mise en page de tableau Android

Ceci est ma TableLayout. Une simple table à deux rangées et deux colonnes. Les cellules de la colonne de gauche sont multiline. Si le texte de l'une de ces cellules est assez grand pour se décomposer en deux lignes, la colonne est étirée pour remplir tout l'écran et les colonnes de droite sont expulsées de l'écran.

Pourquoi? Comment puis-je forcer la table entière à rester à l'intérieur de l'écran? Tout indice est le bienvenu.

Mon TableLayout est la suivante:

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/myTableLayout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<TableRow> 
    <TextView 
     android:text="Account 4 with a very large name to see if it breaks on two or more lines" 
     android:singleLine="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 
    </TextView> 
    <TextView 
     android:text="$400.00" 
     android:gravity="right" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 
    </TextView> 
</TableRow> 

<TableRow> 
    <TextView 
     android:text="Account 5" 
     android:singleLine="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 
    </TextView> 
    <TextView 
     android:text="$400.00" 
     android:gravity="right" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 
    </TextView> 
</TableRow> 

</TableLayout> 

Le code pour afficher la mise en page est simple:

public class AccountBrowserTest 
    extends Activity 
{ 
    public void onCreate(Bundle savedInstanceState) 
    {  
     super.onCreate(savedInstanceState); 

     this.setContentView(R.layout.accountbrowser_test); 

    } 
} 

Répondre

32

Ajouter android: stretchColumns et android:shrinkColumns à l'élément TableLayout:

<TableLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:stretchColumns="1" 
    android:shrinkColumns="1"> 

Les 1 valeurs sont les colonnes que vous voulez que les changements se produisent.Vous pouvez spécifier plus d'une valeur comme ceci:

android:stretchColumns="0,1" 

ou si vous voulez que les changements se produisent à tous vous des colonnes comme ceci:

android:stretchColumns="*" 

S'il vous plaît trouverez ici des informations détaillées: http://android-pro.blogspot.com/2010/02/table-layout.html

0

Il pourrait avoir à faire avec le wrap_content pour la largeur de vos cellules multilignes.

Vous pouvez essayer quelques manières de lui donner une largeur plus explicite ... c'est-à-dire, en définissant le width to 0 et en donnant à toutes les cellules un layout_gravity = 1. Cela devrait faire en sorte que chacune des colonnes occupe une largeur égale (ou vous pouvez ajuster si vous voulez que l'une ait plus de poids que l'autre).

0

Disclaimer: Je ne suis pas vraiment bien avec mises en page, donc je ne jouais un peu avec certaines valeurs, et cela semble fonctionner (je ne peux pas vous donner une bonne explication des raisons pour lesquelles bien):

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/myTableLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TableRow> 
     <TextView 
      android:text="Account 4 with a very large name to see if it breaks on two or more lines" 
      android:singleLine="false" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
     /> 
     <TextView 
      android:text="$400.00" 
      android:gravity="right" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.001" 
     /> 
    </TableRow> 

    <TableRow> 
     <TextView 
      android:text="Account 5" 
      android:singleLine="false" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
     /> 
     <TextView 
      android:text="$400.00" 
      android:gravity="right" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.001" 
     /> 
    </TableRow> 
</TableLayout> 

Notez également que je n'ai pas essayé cette mise en page dans une activité, je l'ai seulement regardée dans la vue de mise en page de l'éditeur xml, mais ça semblait bien au moins là.

0

Vous pouvez également essayer de manipuler stretchColumns et/ou shrinkColumns dans TableLayout.

8

J'ai eu le même problème avec mon application et a trouvé la solution suivante:

<TableLayout 
    android:shrinkColumns="0" 
    android:stretchColumns="1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
</TableLayout> 

Cela fonctionne très bien avec 2 colonnes.

5

J'ai eu le même problème et résolu en ajoutant

android:stretchColumns="0" 

à l'élément TableLayout et la mise en

android:layout_width="0dp" 

sur la TextView qui était trop long.

+2

et ce que cela signifie exactement? Comment avez-vous compris que c'est la solution? – Paul

1

Il y a solution temporaire, faites:

android:stretchColumns = " (number of actual col) - 1 " 

Aucune solution travaillé ici dans mon cas.

5

la disposition de table interne utilise la propriété shrinkColumns pour les colonnes que vous souhaitez leur permettre de réduire pour l'ajustement

la manière la plus facile est:

<TableLayout 
android:shrinkColumns="*"/> 

à rétrécir toutes les colonnes ou vous pouvez écrire au lieu de « * », les indices de colonne que vous voulez réduire, ce qui dans votre cas sera

<TableLayout 
android:shrinkColumns="0,1"/> 

Notez que les indices de colonne commencent à partir de zéro, Le dernier code permet donc de réduire les premières colonnes (index = 0) et secondes (index = 1).

0

Espoir ce code vous aidera .. MainActivity public class activité {

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

<TextView 
     android:id="@+id/tv1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="8dp" 
     android:singleLine="false" 
     android:text="Account 4 with a very large \n name to see if it breaks \n on two or more lines" > 
    </TextView> 

    <TextView 
     android:id="@+id/tv2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="8dp" 
     android:text="$400.00" > 
    </TextView> 
</TableRow>