간단한 예제를 작성하여 문제를 제거했습니다. 다음은 간단한있는 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이하는 모든 것을 계산하려고 시도 할 수 있습니다. 그러나 아마도 더 우아한 해결책이있을 것입니다.
이것은 매우 혼란 스럽습니다. LinearLayout의 모든 자식에 대해 measure()를 호출 할 수 있고 올바른 결과를 반환하면 내 결과를 얻기 위해 다른 메서드 (예 : onWindowFocusChange)가 호출 될 때까지 기다려야하는 이유는 무엇입니까? 내 말은, 주어진 시간에 LinearLayout 및 그 하위 가중치가있는이 값 (실제 너비/높이)에 액세스 할 수 있어야합니다. – bediej
예, 아니요. 크기는 화면 크기 및 방향 변경에 따라 달라지며 다른 구성 요소가 자체 크기를 변경하는 경우에도 달라집니다. – njzk2
좋아요, 몇 가지 빠른 테스트를 만들었고 onWindowFocusChange가 작동하는 것처럼 보입니다 (실제로 너비라는 것은 160입니다). 문제는이 메소드가 호출 될 수 없다는 것입니다 (실제로 활동이 onCreate()에서 대화 상자를 실제로 생성하고 있음). 라이프 사이클의 어느 곳에서도 배치 할 수 없습니다 (문서를 참조하십시오) 그러나 또한이 문제의 해결 방법을 발견했습니다. 즉, ViewTreeObserver onPreDrawListener를 추가합니다. – bediej