마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

GridLayout에서 Button 크기조절하기

0 추천

시작 버튼을 누르면, GridLayout내에 바둑판 형식으로 버튼을 배치하고자 합니다.

xml코드로 android:layout_Width="40dp" 이런식으로 주면 크기 조정이 되는데

java코드에서 btn.setWidth(40); 이와같이 설정해서 생성하면 크기가 제멋대로 나오네요...

현재 제가 짠 코드는 다음과 같습니다.

public class MainActivity extends AppCompatActivity {
    int ix = 8;
    int iy = 8;
    int mine = 8;
    Context context;
    GridLayout manager;
    LinearLayout mainLay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        mainLay = (LinearLayout) findViewById(R.id.MainLay);
        manager = (GridLayout) findViewById(R.id.gameLay);
        Button button = (Button)findViewById(R.id.btnStart);
    }
    public void btnStart_Click(View view) {
        int num=1; //버튼 아이디 변수
        for(int i=0; i<ix; i++)
        {
            for(int j=0; j<iy; j++)
            {
                Button btn = new Button(context);
                btn.setId(num);
                btn.setWidth(40);
                btn.setHeight(40);
                btn.setText("0");
                manager.addView(btn);
                num=num+1;
            }
        }
    }
}
<GridLayout
    android:id="@+id/gameLay"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:columnCount="8">

</GridLayout>
8000자 제한 때문에 xml파일 전체는 못올리네요 ㅠ 그리드뷰 코드만 올립니다.

레이아웃 때문에 몇일째 고생하네요.. 레이아웃만 어찌 해결하면 내부 java코드는 C#과 매우 흡사해서 할만할것같은데..

혹시 바둑판 모양으로 버튼을 생성하는데 있어서 더 알아야할 지식이나 설정이 더 있을까요??

Cro0515 (240 포인트) 님이 2019년 6월 8일 질문

1개의 답변

0 추천

타개발플랫폼에서 안드로이드로 넘어오면 가장 먼저 겪게 되는 어려움이 바로 레이아웃인데요. 모바일이라 해도 IOS 같은 경우는 기기가 한정되어있기 때문에 하드코딩으로 레이아웃하는 경우가 많습니다. 하지만 안드로이드는 정말 다양한 해상도의 기기를 지원해야 하기 때문에, 픽셀로 하드코딩하는 것은 안 좋은 습관입니다. 그리고 안드로이드에서는 다양한 해상도와 디바이스 크기 때문에, 좌표 수치를 픽셀이 아닌 DP를 많이 쓰죠. 어차피 안드로이드 개발을 쭉 하실 거면, 하드코딩으로 레이아웃 하는 습관을 버리시고 layout.xml을 이용해서 레이아웃하는 기본을 공부하시길 바랍니다.  계속 편법으로 쉽게 돌아가려다 보면, 결국 많은 시간을 손해보게 되고, 프로그램도 문제가 많아집니다. 

컴포넌트 개발에 익숙하시다면, 직접 View나 Layout을 만들어 볼 수 있습니다. 

https://www.vogella.com/tutorials/AndroidCustomViews/article.html

 

tellmeo (940 포인트) 님이 2019년 6월 9일 답변
tellmeo님이 2019년 6월 9일 수정
답변 조언 감사합니다.
말씀대로 윈도우 플랫폼과 다르게 xml디자인으로 이루어져서 java에서 별도로 구현을 하는등 많은점이 달라 애먹고있습니다. 처음엔 레이아웃을 어떤 레이아웃을 택해야 할지 몰라서 AbsoluteLayout으로 똑같이 진행하였다가 버튼 크기는 설정한대로 이루어졌으나, 언급하셨던대로 모바일 기기마다 해상도차이로인해 직접 실행하니 스튜디오 디자인창에서와는 다르게 곂쳐서 보이더군요.. 해상도가 전부 다른 모바일기기 특성상 하드코딩이 적합하지 않다는것을 이때 깨닳았습니다..

글을 올린 이후 버튼의 크기를 wrap_content를 주려고 wrap_content의 인수값을 찾아서 -2였는지 -1였는지 할당했지만.. 변화가 없었습니다..ㅠ 또한 버튼을 동적으로 생성하는 코드이기 때문에 layout에서 설정이 불가능할것같은데 다른 방법이있을까요?
동적으로 생성하는 여러 가지 방법이 있겠으나, 이 방법을 원하시는 것 같아 일단 적어봅니다. 나머지 문제는 알아서 잘 해 보시고, 다시 한번 말씀드리자면 기본적인 것부터 먼저 탄탄히 하십시오.

final RelativeLayout layout = (RelativeLayout)findViewById(R.id.container_layout);
layout.post(new Runnable()
    {
        @Override
        public void run()
        {
        int cols = 4;
    int rows = 4;
    int w = layout.getWidth();
    int h = layout.getHeight();
    for (int j=0; j<rows; j++) {
    for (int i=0; i<cols; i++) {
    Button button = new Button(AbsoluteLayoutActivity.this);
    layout.addView(button);    
    button.setX(w*i/cols);
    button.setY(h*j/rows);
    button.setWidth(w/cols);;
    button.setHeight(h/rows);
    button.setText("Button" + i +","+j +"");
    }
    }
        }
    });
답변 감사합니다.
AbsoluteLayout으로 레이아웃 전체 크기를 컬럼과 로우 수로 나눠서 생성하는 방식이군요.. 저렇게하면 확실히 곂치는 문제들을 피할수있겠네요
다만 테이블 형식을 가진 GridLayout으로 만들고있던지라.. GridLayout에서 말씀하셨던것처럼픽셀로 하드코딩 하는 방식이 아닌 warp_content와 같은 방식으로는 불가능할까요? GridLaout에서 가중치도 적용이 안되는것 같더라구요ㅜ
https://stackoverflow.com/questions/10016343/gridlayout-not-gridview-how-to-stretch-all-children-evenly
이것 한번 참조해 보십시오.
정확히 무엇을 구현하시는지 모르겠는데, wrap_content는 내용의 크기에 맞게 size가 결정되는 레이아웃입니다.  즉, button은 label에 따라 크기가 결정되므로, setWidth 하지 못합니다.  GridLayout 뿐만 아니라 TableLayout부터 해서 다양한 Layout등이 있고, 만약에 레이아웃이 마음에 안 든다면, 앞서 드린 링크처럼 직접 Layout을 만들어 쓰면 됩니다. 저는 여기까지만 가이드하겠습니다. 그럼 즐코딩하세요.
...