2017-02-03 2 views
1

그래서 임의의 수의 버튼 (9,16,25)을 추가하여 상대 레이아웃에서 일종의 그리드를 형성하고 싶습니다. 작업 시작시 프로그래밍 방식으로 단추를 추가하고 싶습니다. 예 는 :Android : 프로그래밍 방식으로 여러 버튼 추가 버그

1 2 3 
4 5 6 
7 8 9 

또는

I는 3 × 3 격자

배치해야 예 9 개의 타일을 포함하는 객체라는 BOARD를 생성

1 2 3 4 
5 6 7 8 
9 10 11 12 
13 14 15 16 

이 방법 I 버튼을 추가하십시오 :

buttons = new ArrayList<>(); 
     for (int row = 0; row < board.getNoOfRows(); row ++){ 
      for (int column = 0; column < board.getNoOfColumns() ; column ++){ 
       // first button 
       if(row == 0 && column == 0){ 
        buttons.add(addTile(board.getTile(currentButtonIndex) , null, null)); 

       } 
       // next buttons on the first row 
       else if(row == 0) { 
        buttons.add(addTile(board.getTile(currentButtonIndex) , buttons.get(currentButtonIndex - 1), null)); 

       } 

       // first buttons on subsequent rows 
       else if (row > 0 && column == 0){ 
        buttons.add(addTile(board.getTile(currentButtonIndex) , null, buttons.get(currentButtonIndex - board.getNoOfColumns()))); 

       } 
       // the rest of the buttons 
       else if (row > 0 && column > 0){ 
        buttons.add(addTile(board.getTile(currentButtonIndex) , buttons.get(currentButtonIndex - 1), buttons.get(currentButtonIndex - board.getNoOfColumns()))); 
       } 
       // add the buttons on the view 
       rlBoardView.addView(buttons.get(currentButtonIndex)); 
       currentButtonIndex ++; 
      } 
     } 
     rlBoardView.setGravity(Gravity.CENTER); 

이것은 addTile 메소드입니다 :

private Button addTile(Tile tileParam, Button leftButton, Button aboveButton){ 
     Button tile = new Button(this); 
     tile.setId(tileParam.getIndex()); 
     // setup buttons params 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.WRAP_CONTENT, 
      RelativeLayout.LayoutParams.WRAP_CONTENT 
     ); 
     tile.setTextSize(15); 
     // if button exists on the left, add it to it's right 
     if(leftButton != null){ 
      params.addRule(RelativeLayout.RIGHT_OF, leftButton.getId()); 
     } 
     // if button exists above add it below it 
     if(aboveButton != null){ 
      params.addRule(RelativeLayout.BELOW, aboveButton.getId()); 
     }else{ 

     } 
     tile.setLayoutParams(params); 
     tile.setOnClickListener(this); 
     tile.setText(String.valueOf(tileParam.getNumber())); 

     return tile; 
    } 

문제는 결과 그리드이로 나타나 있다는 것입니다 :

2x2 grid 3x3 grid   4x4 grid 
2   3 2    4 2 3 
    3  6 4 5   8 5 6 7 
      7 8   12 9 10 11 
           13 14 15 

번호 매기기 내가 잘못 뭘하는지 모르겠어요 0

에서 시작합니다. 일부 버튼은 올바른 위치에 있지만 다른 버튼은 완전히 꺼져 있습니다. 또한 버튼 0은 나타나지 않습니다.

답변

0

문제점을 발견 할 수있었습니다.

tile.setId(tileParam.getIndex()); 

각 타일에는 고유 인덱스가 있지만 분명히 충돌이있었습니다. 나는 그것을 다음과 같이 바꿨다 :

tile.setId(View.generateViewId()); 

그리고 이제는 모든 것이 예상대로 작동한다.

0

첫 번째 버튼에 대한 규칙이 없습니다. ALIGN_PARENT_LEFT 및 ALIGN_PARENT_TOP을 추가해야합니다. 그래서 : 당신이 ALIGN_PARENT_LEFT를 추가해야마다 다음 행의 첫 번째 버튼에 또한

if (leftButton == null && aboveButton == null) { 
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
} 

.

+0

추가 규칙을 추가해도 아무런 차이가 없습니다. 동일한 출력을가집니다. –

0

사용자 정의 gridView를 사용하여 필요에 따라 변경하십시오. this sample에 대해 살펴보십시오. 시작하는 것이 좋습니다.

관련 문제