2014-10-11 8 views
0

프로그래밍 방식으로 TableLayout을 만들려고합니다. 구성 가능한 행 및 열 수와 함께 격자 모양의 레이아웃을 만들기 위해 노력하고 있습니다. 이것은 레이아웃 파일에서 할 일이 거의 없겠지만 각 자식 요소가 거의 동일하고 행과 열 개수를 구성 가능하게하려는 경우 가능한 경우 프로그래밍 방식으로 처리하고 싶습니다.프로그래밍 방식으로 TableRow 자식 차원 지정

지금까지 내가 가지고있는 것입니다.

MainActivity.java

private void displayBoard() { 
    TableLayout l = (TableLayout) findViewById(R.id.GameGrid); 
    l.setLayoutParams(new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 

    for (int y = 0; y < b.height(); y++) { 
     TableRow r = new TableRow(this); 
     r.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, 15)); 
     for (int x = 0; x < b.width(); x++) { 
      r.addView(b.getSpaceAt(x, y)); 
     } 
     l.addView(r); 
    } 
} 

Board.java

for (int y = 0; y < spaces.length; y++) { 
    for (int x = 0; x < spaces[0].length; x++) { 
     spaces[y][x] = new BoardSpace(context, x, y); 
    } 
} 

BoardSpace.java

public class BoardSpace extends Button { 
    private ReversiPiece piece; 
    protected int x, y; 

    private BoardSpace(Context c) { 
     super(c); 
    } 

    public BoardSpace(Context c, int x, int y) { 
     super(c); 
    // this.setWidth(25); // Doesn't make a difference, either 
    // this.setHeight(15); // Doesn't make a difference, either 
     piece = null; 
     this.x = x; 
     this.y = y; 
    } 

    public ReversiPiece piece() { 
     return piece; 
    } 

    public void setPiece(ReversiPiece p) { 
     piece = p; 
    } 
} 

나는 기본적으로 버튼의 격자를 만들려고하지만, 지금까지있어 I 변경할 버튼의 크기를 변경할 수 없으므로 화면에 모두 맞출 수 있습니다. 현재 표준 크기로 표시되며 LayoutParams 정의에 대한 변경 사항은 차이가 없습니다.

이 문제는 내 LayoutParams 사용과 관련이 있다고 생각합니다. 각 View 유형과 관련된 LayoutParams 클래스가 많이 있으므로 올바른 클래스를 사용하지 않을 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.

EDIT : 시안화의 권장 사항에 따라 각 TableRow에 대해 새 TableLayout.LayoutParams 개체를 만들지 만 단추는 여전히 기본 크기로 표시됩니다.

답변

0

알 수 있습니다. TableRowout에 TableRowout을 추가 할 때 버튼 자체에 TableRow.LayoutParams를 설정해야 할 때 실제로 TableLayout 및 TableRow의 LayoutParams를 조작하려고했습니다. 여기에는 각 하위 요소 (Button)의 가중치도 지정해야합니다.

private void displayBoard() { 
    TableLayout l = (TableLayout) findViewById(R.id.GameGrid); 
    l.setLayoutParams(new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); 

    for (int y = 0; y < b.height(); y++) { 
     TableRow r = new TableRow(this); 
     r.setWeightSum(b.width()); 
     for (int x = 0; x < b.width(); x++) { 
      BoardSpace s = b.getSpaceAt(x, y); 
      s.setLayoutParams(new TableRow.LayoutParams(
        TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT, 1.0f)); 
      r.addView(s); 
     } 
     l.addView(r); 
    } 
} 

TableRow.setWeightSum()는 행 요소의 수 행의 가중치 합을 설정하는 데 사용 된 다음의 버튼의 LayoutParams 1 중량 전달의 크기 조정하기 위해 버튼을 야기 의도 한대로 화면에 맞 춥니 다. 이 또한, 내가 할 폭을 기대하고 있습니다 표준 크기의 버튼을 유지하는 것 How to set layout_weight attribute dynamically from code?

1

당신이 맞습니다. 그것은 뷰 사이에서 공유되어서는 안되는 LayoutParams에 관한 것입니다. 각 뷰에는 LayoutParams의 자체 복사본이 있어야합니다.

r.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 15)); 

소개 getSpaceAt (그것을위한 코드가없는) : 즉

이 당신이 필요합니다. 프로그래밍 방식으로 뷰를 생성합니까? LayoutParams를 설정하는 것을 기억하고 다시 각 뷰에 대해 분리해야합니다.

잘하면 도움이됩니다.

+0

흠 :

놀랍게도이 답변이 더 일반적인 질문에 대한했지만이 솔루션를 알려준 것입니다 LayoutParams 생성자에 매개 변수로 15px를 전달한다고 생각하면 훨씬 적습니다. 더 자세한 코드 정보를 추가했습니다. –

+0

제안에 감사드립니다. 제안한대로, 각 TableRow에 대한 LayoutParams의 새 복사본을 만들어야한다고 생각합니다.하지만 크기 조정을 올바르게 조정하려면 각 버튼마다 TableRow.LayoutParams를 설정해야했습니다 (내 답변 참조). –