화면 상의 컴포넌트(뷰)들의 위치, 크기 자바로 구하기


화면상에 보이는 뷰들의 크기나 위치를 getX 등의 메소드를 통해 구할 수 있을 줄 알았는데 값들이 전부 0이 나옵니다 ㅠ 왜그런지 알 수 있을까요?

테스트는 프로젝트를 하나 생성후 Basic Activity로 생성하고 기본으로 코드가 있는 FAB를 가지고 테스트를 하였습니다.

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });


ViewGroup.LayoutParams params = fab.getLayoutParams();

        Log.d("test", "width : " + params.width);
        Log.d("test", "height : " + params.height);

        Log.d("test", "X : " + fab.getX());
        Log.d("test", "Y : " + fab.getY());
        Log.d("test", "Bottom : " + fab.getBottom());
        Log.d("test", "Left : " + fab.getLeft());
        Log.d("test", "Right : " + fab.getRight());
        Log.d("test", "Top : " + fab.getTop());
        Log.d("test", "TransX : " + fab.getTranslationX());
        Log.d("test", "TransY : " + fab.getTranslationY()); 
        Log.d("test", "Width : " + fab.getWidth());
        Log.d("test", "Height : " + fab.getHeight());

이렇게 테스트를 하였더니 밑에처럼 결과가 나왔습니다.

05-21 01:26:37.098 2782-2782/comjongchanlee.github.testanything D/test: width : -2
05-21 01:26:37.099 2782-2782/comjongchanlee.github.testanything D/test: height : -2
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: X : 0.0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Y : 0.0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Bottom : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Left : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Right : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Top : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: TransX : 0.0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: TransY : 0.0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Width : 0
05-21 01:26:37.138 2782-2782/comjongchanlee.github.testanything D/test: Height : 0

width나 height라도 나올 줄 알았으나... 이상한 값이 나오고 나머지는 전부 0이 나오네요....

왜이런 건가요?ㅠㅠ 사용을 잘못한 건가요?


  • 혹시 관리자님께서 문제가 될만한 것이다라고 판단이 되면 댓글을 달아주시면 삭제하도록 하겠습니다! 아니면 삭제 부탁드립니다!!    TuTanKhamen   2016.5.21 10:49     
조회수 264


2 답변


헐.......... 자답합니다....

글을 지울 수도 있지만 혹시나 다른분들이 볼 수 도 있기에 남겨놓습니다!

저는 onCreate 안에서 구했는데

onCreate는 화면에 뷰들이 그려지기 전에 호출 되기 때문에 이때는 객체의 사이즈를 구할 수 없다고...

그래서

onWindowFocusChanged(boolean hasFocus) 안에서 구하면 된다고 하네요...

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        ViewGroup.LayoutParams params = fab.getLayoutParams();

        Log.d("test", "width : " + params.width);
        Log.d("test", "height : " + params.height);

        Log.d("test", "X : " + fab.getX());
        Log.d("test", "Y : " + fab.getY());
        Log.d("test", "Bottom : " + fab.getBottom());
        Log.d("test", "Left : " + fab.getLeft());
        Log.d("test", "Right : " + fab.getRight());
        Log.d("test", "Top : " + fab.getTop());
        Log.d("test", "TransX : " + fab.getTranslationX());
        Log.d("test", "TransY : " + fab.getTranslationY());
        Log.d("test", "Width : " + fab.getWidth());
        Log.d("test", "Height : " + fab.getHeight());
    }

이렇게 했더니

05-21 01:46:09.581 16524-16524/comjongchanlee.github.testanything D/test: width : -2
05-21 01:46:09.581 16524-16524/comjongchanlee.github.testanything D/test: height : -2
05-21 01:46:09.581 16524-16524/comjongchanlee.github.testanything D/test: X : 864.0
05-21 01:46:09.581 16524-16524/comjongchanlee.github.testanything D/test: Y : 1560.0
05-21 01:46:09.582 16524-16524/comjongchanlee.github.testanything D/test: Bottom : 1728
05-21 01:46:09.582 16524-16524/comjongchanlee.github.testanything D/test: Left : 864
05-21 01:46:09.582 16524-16524/comjongchanlee.github.testanything D/test: Right : 1032
05-21 01:46:09.582 16524-16524/comjongchanlee.github.testanything D/test: Top : 1560
05-21 01:46:09.585 16524-16524/comjongchanlee.github.testanything D/test: TransX : 0.0
05-21 01:46:09.585 16524-16524/comjongchanlee.github.testanything D/test: TransY : 0.0
05-21 01:46:09.585 16524-16524/comjongchanlee.github.testanything D/test: Width : 168
05-21 01:46:09.585 16524-16524/comjongchanlee.github.testanything D/test: Height : 168

이렇게 나왔습니다~~



더 일반적인 방법이 있는데요~

안드로이드에서 View 가 구성되는 과정에 콜백을 붙일 수 가 있거든요.

위의 경우에는

fab.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                fab.getViewTreeObserver().removeOnPreDrawListener(this);
                //여기서 뷰의 크기를 가져온다. 
                return true;
            }
        });

이렇게 하면 실제 그려지기 직전에 뷰 사이즈를 다 가져올 수 있습니다.

onWindowFocusChanged 의 경우 그런 용도로 불리는건 아니라서 의도치 않게 여러번 불릴수도 있을 것 같아요!~


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close