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

조회수 3852회

화면상에 보이는 뷰들의 크기나 위치를 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이 나오네요....

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

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 혹시 관리자님께서 문제가 될만한 것이다라고 판단이 되면 댓글을 달아주시면 삭제하도록 하겠습니다! 아니면 삭제 부탁드립니다!! 알 수 없는 사용자 2016.5.21 10:49

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 의 경우 그런 용도로 불리는건 아니라서 의도치 않게 여러번 불릴수도 있을 것 같아요!~

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)