안드로이드 개발 질문/답변
(글 수 45,052)
<?xml version="1.0" encoding="utf-8"?> <Linear xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/main01" android:layout_height="fill_parent" android:layout_width="fill_parent"> <ImageView android:id="@+id/ImageView01" android:background="@drawable/img01" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="1"> </ImageView> <ImageView android:id="@+id/ImageView02" android:background="@drawable/icon" android:layout_height="fill_parent" android:layout_width="fill_parent" android:layout_weight="3" android:visibility="gone"> </ImageView> </LinearLayout> public class ViewGroupTest extends Activity implements OnClickListener { /** Called when the activity is first created. */ private LinearLayout layout; private ImageView view1; private ImageView view2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); layout = (LinearLayout) findViewById(R.id.main01); view1 = (ImageView) findViewById(R.id.ImageView01); view1.setOnClickListener(this); view2 = (ImageView) findViewById(R.id.ImageView02); view2.setOnClickListener(this); } public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus); Log.i("DEBUG", "onWindowFocusChanged " ); } public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.ImageView01: view2.setVisibility(View.VISIBLE); Log.i("DEBUG", "view2 = " + view2.getWidth()); Log.i("DEBUG", "view2 = " + view2.getHeight()); break; case R.id.ImageView02: break; } } } 위의 코드로 실행하면 로그에서 각각의 넓이, 높이가 0으로 나옵니다. 제가 알기로는 XML에서 정확한 수치를 설정하는 게 아니고 fill_parent, wrap_content, weight 로 설정하면 onWindowFocusChanged 호출되기전까지 높이, 넓이가 정해지지 않는다고 알고 있습니다. 만약 위처럼 ImageView 설정 값을 코드로 수정하고, 높이 또는 넓이 알고 싶을 때 어떻게 알수가 있나요? 혹시 각각의 ImageView 상속받아서 재정의(onWindowFocusChanged) 를 해야 하는지요?
2010.04.10 12:13:08
위코드는 일단 1번째 View가 화면을 다차지해서 두번째 View가 표시할 영역이 없어어 생기는 문제겠죠. onClick시점에는 보통 width height가 결정되어있습니다.
2010.04.10 12:23:31
회색님 답변 감사드립니다. onClick 시점에서 width height 결정된다면 0,0으로 값들이 나오는 게 정상인가요? 제가 잘 이해가 가지 않습니다. view1 을 클릭했을 경
우 view2.setVisibility(View.VISIBLE); 이
코드 실행됩니다 실제로 에뮬에서도 view2 가 보이는데요,
view2.setVisibility(View.VISIBLE);
이 코드 밑에 view2 넓이, 높이 로그를 표시하도록 했는데 해당 값들이 0,0으로 나와서 입니다. 왜 0,0으로 나와야
하는지 이해가 잘 가지 않습니다. 만약 그렇다면 view2 넓이, 높이 값을 정상적으로 얻기 위해서는 어떻게 해야하는지요?
2010.04.10 15:25:16
view2가 gone으로 되어있나요. invisible로 되어있나요. invisible로 되어있었다면 넓이와 높이는 이미 결정되어있을것 같은데요
2010.04.10 21:24:52
view2 가 처음에는 gone 으로 되어 있다가 visible 로 바뀌게 되어 있네요. view2.setVisibility(View.VISIBLE); 함수를 호출하는 순간에 바로 View Layout 이 다시 그려지는 것이 아니라서 값을 설정한 직후에 view 의 height / width 값을 가져오시면 0 이 나올거 같습니다. 좀 번거롭지만,
view2.setOnFocusChangeListener(new OnFocusChangeListener(){
@Override
public void onFocusChange(View v, boolean hasFocus) {
Log.i("DEBUG", "h: " + view2.getHeight());
Log.i("DEBUG", "w: " + view2.getWidth());
}
});
이런식으로 view2 에 추가적인 focusChangelistenr 를 달아 주시고, 해당 listenr 에서 width/ height 값을 가져오셔야 할 듯 하네요.
2010.04.12 22:40:13
(추천:
1 / 0)
제가 직접 확인 해 보니 이 방법도 작동 하지 않네요;;;; 결국 무식하게 post 함수를 써서 다음과 같이 구현하였습니다. 잘못된 정보를 알려드린 점 정말 죄송합니다 이구구...
view2.setVisibility(View.VISIBLE);
view2.post(new Runnable(){
@Override
public void run() {
Log.i("DEBUG", "h2: " + view2.getHeight());
Log.i("DEBUG", "w2: " + view2.getWidth()); }
});
break;