2011-08-16 11 views
2

간단한 예제를 작성하여 문제를 제거했습니다. 다음은 간단한있는 LinearLayout입니다 :가중치가 설정된 경우 getMeasuredWidth()를 얻는 방법

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ll" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
</LinearLayout> 

다음 나는()에서 onCreate에서 그것을 채울

아이콘이 48x48dp의 간단한 이미지입니다
private final String TAG = getClass().getSimpleName(); 

ImageView iv1; 
ImageView iv2; 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    LinearLayout container = (LinearLayout) findViewById(R.id.ll); 
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
    lp.weight=1.0f; 

    iv1 = new ImageView(this); 
    iv1.setImageResource(R.drawable.icon); 

    iv2 = new ImageView(this); 
    iv2.setImageResource(R.drawable.icon); 

    container.addView(iv1, lp); 
    container.addView(iv2, lp); 

    container.measure(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); 
    Log.d(TAG, " measured width(1): " + iv1.getMeasuredWidth()); 
    Log.d(TAG, " measured width(2): " + iv2.getMeasuredWidth()); 

. 질문은 : getMeasuredWidth가 Logs에서 48을 반환하는 이유는 무엇입니까?하지만 계층 뷰어에서 보면 mMeasureWidth는 160입니까? 다른 말로하면 실제 질문은 .. 선형 너비가 길어질 때 뷰의 실제 너비/높이 (Java에서)를 어떻게 얻을 수 있습니까? requestLayout()을 호출하면 measure()가 작동하지 않습니다. 나는 weighths의 합계를 얻고 LinearLayout이하는 모든 것을 계산하려고 시도 할 수 있습니다. 그러나 아마도 더 우아한 해결책이있을 것입니다.

답변

2

onCreate는 활동이 표시되기 훨씬 전에 호출됩니다.

따라서 iv1.getMeasuredWidth()는 예상 한 값이 아니며 나중에 다른 메소드에서 호출해야합니다. 나는 onWindowFocusChange가 맞다고 생각한다.

+0

이것은 매우 혼란 스럽습니다. LinearLayout의 모든 자식에 대해 measure()를 호출 할 수 있고 올바른 결과를 반환하면 내 결과를 얻기 위해 다른 메서드 (예 : onWindowFocusChange)가 호출 될 때까지 기다려야하는 이유는 무엇입니까? 내 말은, 주어진 시간에 LinearLayout 및 그 하위 가중치가있는이 값 (실제 너비/높이)에 액세스 할 수 있어야합니다. – bediej

+0

예, 아니요. 크기는 화면 크기 및 방향 변경에 따라 달라지며 다른 구성 요소가 자체 크기를 변경하는 경우에도 달라집니다. – njzk2

+1

좋아요, 몇 가지 빠른 테스트를 만들었고 onWindowFocusChange가 작동하는 것처럼 보입니다 (실제로 너비라는 것은 160입니다). 문제는이 메소드가 호출 될 수 없다는 것입니다 (실제로 활동이 onCreate()에서 대화 상자를 실제로 생성하고 있음). 라이프 사이클의 어느 곳에서도 배치 할 수 없습니다 (문서를 참조하십시오) 그러나 또한이 문제의 해결 방법을 발견했습니다. 즉, ViewTreeObserver onPreDrawListener를 추가합니다. – bediej

관련 문제