2009-12-27 5 views
7

Ich verwende ein TableLayout in meiner Anwendung. Es enthält vier TableRows, die jeweils vier ImageViews enthalten. Das gewünschte Verhalten ist das Skalieren des Layouts auf die kürzeste Dimension.Wie bekomme ich ein Android TableLayout, um die Eltern im Querformat zu füllen?

Im Hochformat funktioniert es gut, im Querformat klappt es jedoch kläglich.

Aus der documentation sieht es so aus, weil die TableRow layout_height immer auf WRAP_CONTENT festgelegt ist. Während ich die Dimensionen der einzelnen Ansichten einstellen kann, wird die TableLayout überhaupt nicht rendern, wenn ich die View layout_height auf FILL_PARENT setze.

Ich fühle mich wie es ist etwas einfaches, das ich vermisse. Gibt es eine Möglichkeit, das TableLayout mit TableRows zu skalieren, um die Höhe im Querformat anzupassen?

XML Layout:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/table" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:shrinkColumns="*"> 
</TableLayout> 

Java:

public class Example extends Activity { 

private TableLayout mTable; 
private int[] mDrawableIds = { R.drawable.draw01, R.drawable.draw02, R.drawable.draw03, R.drawable.draw04, R.drawable.draw05, R.drawable.draw06, R.drawable.draw07, R.drawable.draw08, R.drawable.draw09, R.drawable.draw10, R.drawable.draw11, R.drawable.draw12, R.drawable.draw13, R.drawable.draw14, R.drawable.draw15, R.drawable.draw16 }; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mTable = (TableLayout)findViewById(R.id.table); 
    for (int j=0; j<4; j++) { 
     TableRow tr = new TableRow(this); 
     tr.setLayoutParams(new ViewGroup.LayoutParams( LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT)); 
      for (int i=0; i<4; i++) { 
       ImageView iv = new ImageView(this); 
       iv.setImageResource(mDrawableIds[j*4+i]); 
       iv.setScaleType(ImageView.ScaleType.FIT_CENTER); 
       iv.setAdjustViewBounds(true); 
       tr.addView(iv); 
      } 
     mTable.addView(tr); 
    } 
} 
} 
+0

Funktioniert ein GridView nicht für Ihren Anwendungsfall? GridView-Tutorial hier: http://developer.android.com/guide/tutorials/views/hello-gridview.html –

+0

GridView scheint zu scrollen, anstatt die ImageViews auf das Landscape-Layout zu skalieren. Vielleicht, wenn ich die Bildressourcen verkleinern würde, könnte das funktionieren. Ich hatte gehofft zu vermeiden, die Größe der Bilder zu ändern. –

Antwort

4

Ich habe herausgefunden, wie das geht. Im Grunde genommen war der Teil, der nicht so funktionierte wie ich wollte, die TableRows. Als ich in die Landschaft wechselte, änderten die ersten beiden TableRows die Größe überhaupt nicht und der dritte verzehrte den Rest des Platzes. Die vierte Zeile wurde überhaupt nicht angezeigt.

Ich fand heraus, dass ich die layout_weight der TableRows auf gleiche Werte setzen musste. Aber es gibt kein Verfahren, dass zur Laufzeit zu tun, also baute ich die folgende Layout-Datei, die ich row.xml genannt:

<?xml version="1.0" encoding="utf-8"?> 
<TableRow xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/trow" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:layout_weight="1"> 
</TableRow> 

Dann habe ich eine LayoutInflater die Zeile zur Laufzeit mit den Eigenschaften zu bauen Ich wollte :

mTable = (TableLayout)findViewById(R.id.table); 
    LayoutInflater inflater = getLayoutInflater(); 

    for (int j=0; j<4; j++) { 
     View row = inflater.inflate(R.layout.row, mTable,false); 
     TableRow tr = (TableRow)row.findViewById(R.id.trow); 
      for (int i=0; i<4; i++) { 
       View image = inflater.inflate(R.layout.image, tr, false); 
       ImageButton ib = (ImageButton)image.findViewById(R.id.image); 
       ib.setAdjustViewBounds(true); 
       ib.setImageResource(mCardIds[j*4+i]); 
       tr.addView(ib); 
      } 
     mTable.addView(tr); 
    } 

Jetzt wird die Größe der TableRows bei der Drehung richtig geändert. Ich habe die ImageViews zu ImageButtons geändert, weil ich entschieden habe, etwas onClick-Verhalten hinzuzufügen, und ich erstelle diese Schaltflächen über eine separate XML-Datei, aber ich denke nicht, dass diese Details für das Problem der Größenänderung relevant sind.

+0

hinzufügen 'android: layout_weight =" 1 "' zu jeder Spalte in der Tabellenüberschrift Zeile löste mein Problem, nett – knownUnknown

4

Ändern Sie Ihre XML-Layout:

<?xml version="1.0" encoding="utf-8"?> 
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/table" 
     android:layout_width="fill_parent" 
     android:layout_height="160dp" 
     android:shrinkColumns="*"> 
</TableLayout> 

Das sollte es unabhängig von der Ausrichtung gesamten Bildschirm Höhe machen nehmen. Siehe density independent pixels

0

Ich versuchte die akzeptierte Lösung hier, aber es hat nicht funktioniert. Was funktioniert, ist wie folgt:

TableRow tr = new TableRow(this); 
TableLayout.LayoutParams pRowTop = new TableLayout.LayoutParams(
       TableLayout.LayoutParams.MATCH_PARENT, 
       TableLayout.LayoutParams.WRAP_CONTENT); 
pRowTop.weight = 1; 
mTable.addView(tr, pRowTop); 
Verwandte Themen