2012-04-16 3 views
2

Je suis assez près d'aller pour une alternative LinearLayout, mais son genre d'irritant ne pas obtenir ce droit. Pour obtenir le maximum de flexibilité, j'ai défini un fichier XML TableLayout avec uniquement un en-tête de ligne défini. Ensuite, j'ai généré un xml TableRow distinct définissant le "modèle de ligne". En Javacode j'ai sous-classé TableRow et dans le constructeur je gonfle le template tablerow pour attacher à la racine (la classe sous-classée).Layouttroubles étendant tablerow et gonflant xer tablerow

Eh bien, bien jusqu'à présent. Lorsque la table est remplie, le headerrow est correct, mais les autres lignes ne le sont pas. On dirait qu'ils sont disposés différemment, les deux colonnes ne remplissent pas toute la largeur comme prévu et les colonnes ne sont donc pas alignées correctement l'une par rapport à l'autre.

Quelqu'un qui peut faire la lumière sur celui-ci? J'ai essayé beaucoup de solutions, mais rien ne le fait fonctionner.

Le TableLayout avec en-tête ligne

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" > 

    <HorizontalScrollView 
     android:id="@+id/horizontalScrollView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fillViewport="true" > 

     <TableLayout 
      android:id="@+id/zone_table" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:stretchColumns="*" > 

      <TableRow 
       android:id="@+id/tableRow1" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="fill_horizontal" 
       android:clipToPadding="false" > 

       <TextView 
        android:layout_width="0dip" 
        android:layout_weight="0.8" 
        android:background="#ffcccccc" 
        android:text="Zonename" 
        android:textColor="@android:color/black" /> 

       <TextView 
        android:layout_width="0dip" 
        android:layout_weight="0.2" 
        android:background="#ffcccc00" 
        android:gravity="right" 
        android:text="Antall" 
        android:textColor="@android:color/black" /> 
      </TableRow> 
     </TableLayout> 
    </HorizontalScrollView> 

</ScrollView> 

La "autre" rangée gonflé

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

    <TextView 
     android:id="@+id/zonerow_name" 
     android:layout_width="0dip" 
     android:layout_weight="0.8" 
     android:background="#ffcccccc" 
     android:textSize="18dp" /> 

    <TextView 
     android:id="@+id/zonerow_invcount" 
     android:layout_width="0dip" 
     android:layout_gravity="right" 
     android:layout_weight="0.2" 
     android:background="#ffcccc00" 
     android:textSize="18dp" /> 

</TableRow> 

Classe extension TableRow

public class ZoneRow extends TableRow { 
    private ZoneInventoryDAO dao = null; 
    private int inventoryCount = 0; 

    public ZoneRow(Context ctx, ZoneInventoryDAO dao) { 
     this(ctx, dao, 0); 
    } 

    public ZoneRow(Context ctx, ZoneInventoryDAO dao, int inventoryCount) { 
     super(ctx); 
     setWeightSum(1.0f); 
     this.dao = dao; 
     this.inventoryCount = inventoryCount; 
     doLayout(); 
    } 

    private void doLayout() { 
     // XML layouten settes med zonerow som parent (se: 
     // http://developer.android.com/resources/articles/layout-tricks-merge.html) 
     View v = LayoutInflater.from(getContext()).inflate(R.layout.zonerow, 
       this, true); 
     TextView t = (TextView) findViewById(R.id.zonerow_name); 
     TextView cnt = (TextView) findViewById(R.id.zonerow_invcount); 

     t.setText(dao.getZoneAlias()); 
     cnt.setText(String.valueOf(inventoryCount)); 

    } 

    public void incInventory() { 
     inventoryCount++; 
    } 

    public ZoneInventoryDAO getDAO() { 
     return dao; 
    } 

} 

Répondre

0

Ce qu'il ressemble est que vous étendez tablerow et créer une instance de cet objet. Cela entraînera une ligne de table à créer. Ensuite, vous gonflez un autre tablerow qui, pour une raison quelconque, interagit avec le premier. Pour une solution rapide, essayez d'ajouter quelque chose comme table.setColumnStretchable (0, true);

0

J'ai le même problème. Je l'ai corrigé en ne faisant pas cela - en particulier en ne sous-classant pas TableRow, mais juste en les instanciant dans le code et en appliquant tout ce dont j'avais besoin à la main. Vous pouvez le faire en encapsulant à la place. Avoir un enregistrement qui a ZoneInventoryDAO, inventoryCount et tableRow, qui pointe vers l'instance TableRow correspondante. Juste instancier TableRow avec une inflation:

TableLayout table = (TableLayout) inflater.inflate(R.layout.my_table, null); // etc 
... 
for (//each data item//) { 
    TableRow tr = (TableRow) inflater.inflate(R.layout.my_table_row, null); 
    TextView tv1 = (TextView) findViewById(R.id.table_entry_1); 
    tv1.setText("Whatever goes here"); 
    ... 
    // and so on for each column 
    table.addView(tr); 
} 

ci-dessus a fonctionné pour moi lors du déplacement ce même code dans une classe qui étend TableRow n'a pas.

0

Je sais que c'est vieux, mais j'ai eu le même problème, et je l'ai compris, alors peut-être que cela aidera les futurs utilisateurs. Le problème est que lorsque vous gonflez le TableRow à partir de XML, et que vous l'ajoutez dans votre TableRow étendu, il est vu par la Table comme une seule colonne, avec plusieurs enfants, comme le TableRow dans votre Layout est fondamentalement un ViewGroup. Par conséquent, il présente la table, sous la forme d'une table à une seule colonne.

La solution est que dans la disposition XML TableRow, utilisez un type <merge> plutôt qu'un type <TableRow>. Ainsi, une fois gonflés, les éléments de votre fichier XML seront fusionnés dans votre TableRow étendu et votre TableRow étendu aura plusieurs colonnes.

Voici le code exemple

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

    <TextView 
     android:id="@+id/zonerow_name" 
     android:layout_width="0dip" 
     android:layout_weight="0.8" 
     android:background="#ffcccccc" 
     android:textSize="18dp" /> 

    <TextView 
     android:id="@+id/zonerow_invcount" 
     android:layout_width="0dip" 
     android:layout_gravity="right" 
     android:layout_weight="0.2" 
     android:background="#ffcccc00" 
     android:textSize="18dp" /> 

</merge>