2009-12-27 6 views
7

내 응용 프로그램에서 TableLayout을 사용하고 있습니다. 여기에는 4 개의 ImageView가 포함 된 4 개의 TableRow가 포함되어 있습니다. 내가 원하는 동작은 가장 짧은 치수에 맞게 레이아웃을 확장하는 것입니다.가로 모드에서 부모를 채우기 위해 Android TableLayout을 얻으려면 어떻게해야하나요?

세로 모드에서는 정상적으로 작동하지만 가로 모드에서는 비참하게 실패합니다.

documentation에서 TableRow layout_height는 항상 WRAP_CONTENT로 설정되어 있기 때문입니다. 개별 Views의 크기를 설정할 수는 있지만 View Layout_height를 FILL_PARENT로 설정하면 TableLayout이 전혀 렌더링되지 않습니다.

내가 누락 된 단순한 무언가가있는 것처럼 느껴집니다. 가로 모드에서 높이에 맞게 크기를 조정하기 위해 TableRowout을 사용하여 TableLayout을 가져 오는 방법이 있습니까?

XML 레이아웃 :

<?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> 

자바 :

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

사용 사례에 따라 GridView가 작동하지 않습니까? GridView 튜토리얼은 http://developer.android.com/guide/tutorials/views/hello-gridview.html –

+0

GridView는 ImageViews를 가로 레이아웃으로 크기를 조정하지 않고 스크롤하려고합니다. 아마도 이미지 리소스를 작게 만들면 작동 할 수도 있습니다. 이미지의 크기를 조정하지 않기를 바랬습니다. –

답변

4

이 방법을 알아 냈습니다. 기본적으로, 내가 원했던 방식으로 작동하지 않는 부분은 TableRow였습니다. 가로 방향으로 변경하면 처음 두 테이블의 크기가 전혀 조정되지 않고 나머지 세 공간은 나머지 공간을 소모합니다. 네 번째 행은 전혀 표시되지 않았습니다.

TableRows의 layout_weight를 같은 값으로 설정해야한다는 것을 알았습니다. 그러나,이 런타임에 그렇게 할 수있는 방법입니다, 그래서 내가 row.xml라는 다음 레이아웃 파일, 내장 : 다음

<?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> 

내가 원하는 속성 런타임에 행을 구축 할 LayoutInflater에서 사용을 :

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); 
    } 

이제 회전시 TableRows의 크기가 올바르게 조정됩니다. onClick 비헤이비어를 추가하기로 결정했기 때문에 ImageViews를 ImageButton으로 변경했는데 별도의 XML 파일을 통해 해당 버튼을 만들었지 만 크기 조정 문제와 관련이 있다고는 생각하지 않습니다.

+0

테이블 제목 행의 각 열에'android : layout_weight = "1"'을 추가하여 내 문제를 해결했습니다. nice – knownUnknown

4

가 당신의 XML 레이아웃을 변경 :이 방향에 관계없이 전체 화면의 높이를 차지해야한다

<?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> 

. density independent pixels

0

여기 허용 된 해결책을 시도했지만 작동하지 않았습니다. 작동되는 내용은 다음과 같습니다.

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); 
관련 문제