Как getMeasuredWidth (), когда вес установлен - PullRequest
2 голосов
/ 16 августа 2011

Я сделал простой пример, чтобы проиллюстрировать проблему. Вот простая LinearLayout:

<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 ()

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());

где значок - это простое изображение размером 48x48 точек на дюйм. Вопрос в том, почему getMeasuredWidth возвращает 48 в журналах, но когда я смотрю в иерархическом средстве просмотра, mMeasureWidth составляет 160? Другими словами, реальный вопрос заключается в следующем: как я могу получить реальную ширину / высоту (в Java) вида, когда он растянут в LinearLayout? Вызов requestLayout (), measure () не работает. Я мог бы попытаться получить сумму весов и рассчитать все, что делает LinearLayout, но, возможно, есть более элегантное решение.

1 Ответ

2 голосов
/ 16 августа 2011

onCreate вызывается задолго до отображения активности.

Следовательно, iv1.getMeasuredWidth () еще не является ожидаемым значением и должно быть вызвано в другом методе позже. Я думаю, что onWindowFocusChange является правильным.

...