안드로이드 개발 질문/답변
(글 수 45,052)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/MainLayout01"> <ImageView android:id="@+id/ImageView01" android:background="@drawable/abc2" android:layout_weight="2" android:layout_height="fill_parent" android:layout_width="fill_parent"> </ImageView> <ImageView android:id="@+id/ImageView02" android:background="@drawable/abc2" android:layout_weight="3.5" android:layout_width="fill_parent" android:layout_height="fill_parent" android:visibility="gone" android:focusable="false"> </ImageView> </LinearLayout>
public class ViewTB extends Activity implements OnClickListener, OnFocusChangeListener, OnTouchListener { /** Called when the activity is first created. */ private LinearLayout layout; private CImageView imgView01; private CImageView imgView02; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imgView01.setOnClickListener(this); imgView02.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.ImageView01: imgView02.setVisibility(View.VISIBLE); Log.i("DEBUG", "onClick imgView01 Width = " + imgView01.getWidth()); Log.i("DEBUG", "onClick imgView01 Height = " + imgView01.getHeight()); Log.i("DEBUG", "onClick imgView02 Width = " + imgView02.width); Log.i("DEBUG", "onClick imgView02 Height = " + imgView02.height); break; case R.id.ImageView02: break; } }
위의 소스를 간략하게 설명드리면 XML 에서 LinearLayout 메인 레이아웃으로 설정하고
ImageView01 를 전체 화면을 설정합니다. 그리고 weight = 2 로 설정해 놓습니다.
ImageView02 의 경우는 gone 으로 설정값을 주어서 화면을 표시되지 않도록 합니다. 그리고 weight = 3으로 설정해 놓습니다.
이처럼 설정해 놓고 실제 코드에서
ImageView01 클릭 했을 경우에 ImageView02 을 visible 로 설정을 합니다.
이런 경우에 보여지는 ImageView02 넓이, 높이 값들을 얻고자 하는데요 위의 소스대로 해 놓으면 0,0 으로만 값이 들어옵니다.
하지만 다시 한번 ImageView01 클릭 했을 경우 ImageView02 의 넓이 높이 값들이 정상적으로 로그가 찍힙니다.
왜 첫번 째 클릭 시에 정상적으로 넓이 높이 값이 나오지 않는지 궁금합니다.
어떤 분께서 onWindowFocusChanged 메소드 안에서 넓이 높이 값들을 읽으면 된다고 하셨는데 마찬가지입니다.
안드로이드에서 원래 안되는 것을 제가 하고자 하는 건지 참 답답합니다. ;;
2010.04.12 17:34:55
gone->visible 후에 크기가 나오려면 레이아웃이 한번은 돼야 합니다. 레이아웃하면서 크기가 정해지는 거니까요.
근데 setVisible() 호출 할 당시에는 레이아웃을 안합니다. 대략 레이아웃 및 화면 갱신을 요청만 해두죠. 아시다시피 invalidate() 한다고 해서 화면이 바로 그려지는 건 아니잖아요?
요는, 레아아웃이 안된 상태이기 때문에 크기가 안나온다란 겁니다.
(최초에 visible되고 나서도 어떤 이유로 인해 저 뷰들의 크기가 또 바뀌었다면, 크기가 바뀌기 전의 값이 나올겁니다)
꼭 이렇게 눌렸을때 크기를 구하셔야 하는 게 아니라면 onLayout(...)에서 구해보시면 될 것 같습니다.
눌렸을때 받아야 돼면... 관련 내용을 Runnable로 만들어서 Handler나 View에다가 post하면 되려나... (안해봐서 제대로 될진 모르겠슴다)
근데 setVisible() 호출 할 당시에는 레이아웃을 안합니다. 대략 레이아웃 및 화면 갱신을 요청만 해두죠. 아시다시피 invalidate() 한다고 해서 화면이 바로 그려지는 건 아니잖아요?
요는, 레아아웃이 안된 상태이기 때문에 크기가 안나온다란 겁니다.
(최초에 visible되고 나서도 어떤 이유로 인해 저 뷰들의 크기가 또 바뀌었다면, 크기가 바뀌기 전의 값이 나올겁니다)
꼭 이렇게 눌렸을때 크기를 구하셔야 하는 게 아니라면 onLayout(...)에서 구해보시면 될 것 같습니다.
눌렸을때 받아야 돼면... 관련 내용을 Runnable로 만들어서 Handler나 View에다가 post하면 되려나... (안해봐서 제대로 될진 모르겠슴다)
이미 visible이 숨김으로 되어있어서 그런것일수도 있겠네요...
가라식으로 xml에 visible을 설정해놓지 않고 activity에서 oncreate에서
일단 불러오고 높이, 넓이를 받은 후에 숨기면 순식간에 일어나는 일이라
사용자는 화면에서 인식을 못하지 않을까요?
정확한 답이 있다면 아래에 능력자분이 달아주실듯...ㅎ