Вопрос:

Если я вызываю getMeasuredWidth () или getWidth () для макета в onResume, они возвращают 0

android layout measurement

31622 просмотра

7 ответа

1398 Репутация автора

Если я вызываю getMeasuredWidth () или getWidth () для макета в onResume, они возвращают 0. Я думаю, что это представление еще не нарисовано в данный момент.

Также я думаю, что мне нужно поместить getMeasuredWidth () или getWidth () в метод обратного вызова, вызываемый после отрисовки компоновки и известных измерений вида. Какой метод обратного вызова Android я должен использовать?

Автор: mobiledev Alex Источник Размещён: 04.08.2011 09:26

Ответы (7)


5 плюса

5819 Репутация автора

вы можете переопределить onLayout () в вашем представлении; это используется android для позиционирования каждого из дочерних элементов представления, так что вы можете делать то, что вы хотите сделать там после super(..)вызова.

Автор: MrJre Размещён: 04.08.2011 09:35

4 плюса

1126 Репутация автора

Действительно, похоже, что если макет не отображается на экране, метод getWidth () возвращает 0. Для меня, по-видимому, работает вызов метода measure () перед вызовом getMeasuredWidth () или getMesuredHeight (). Для метода меры я использовал аргументы Layout.WRAP_CONTENT, чтобы получить измерение того, что содержит макет.

Надеюсь, это поможет, Михай

Автор: r1k0 Размещён: 13.02.2012 10:58

37 плюса

16282 Репутация автора

Этот ответ говорит:

Используйте ViewTreeObserverна Viewожидания первого макета. Только после первого макета будет getWidth()/getHeight()/getMeasuredWidth()/getMeasuredHeight()работать.

ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
  viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      viewWidth = mediaGallery.getWidth();
      viewHeight = mediaGallery.getHeight();
    }
  });
}
Автор: Jeff Axelrod Размещён: 29.07.2012 03:28

78 плюса

10338 Репутация автора

Решение

Вы не можете использовать width/ height/ getMeasuredWidth/ getMeasuredHeightна a Viewдо того, как система отобразит его (обычно из onCreate/ onResume).

Простым решением для этого является размещение Runnableв макете. Runnable будет выполнен после того, Viewкак был выложен.

BoxesLayout = (RelativeLayout) findViewById(R.id.BoxesLinearLayout);
BoxesLayout.post(new Runnable() {
    @Override
    public void run() {
        int w = BoxesLayout.getMeasuredWidth();
        int h = BoxesLayout.getMeasuredHeight();

        ...
    }
});
Автор: Adorjan Princz Размещён: 20.01.2013 02:27

1 плюс

7586 Репутация автора

Решение № 1: Чтобы сделать это динамически, вам нужен тег. Тег - это, по сути, способ представления воспоминаний. Поэтому сохраните convertView в другом классе (MyTag). Итак, внутри вашего Java-файла:

private LayoutInflater layoutInflater;

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    MyTag holder = null;
    View row = convertView;
    if (row == null) {
      //Inflate the view however u can  
String strInflater = Context.LAYOUT_INFLATER_SERVICE;
        layoutInflater = (LayoutInflater) context.getSystemService(strInflater);
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResID, parent, false);
               holder = new MyTag();

            holder.itemName = (TextView) row.findViewById(R.id.example_itemname);
            holder.icon = (ImageView) row.findViewById(R.id.example_image);
            holder.button1 = (Button) row.findViewById(R.id.swipe_button1);
            holder.button2 = (Button) row.findViewById(R.id.swipe_button2);
            holder.button3 = (Button) row.findViewById(R.id.swipe_button3);
            row.setTag(holder);
        } else {
            holder = (MyTag) row.getTag();
        }

        holder.itemName.setText(itemdata.getItemName());
        System.out.println("holder.button3.getMeasuredWidth()= "+ holder.button3.getMeasuredWidth());
        System.out.println("holder.button3.getWidth()= "+ holder.button3.getWidth());

return row;
} //End of getView()


static class MyTag {  //It also works if not static

        TextView itemName;
        ImageView icon;
        Button button1;
        Button button2;
        Button button3;
    }

Решение № 2: Жесткий код Предварительно установите ширину. Внутри вашего файла res / values ​​/ dimensions.xml включите

<dimen name="your_button_width">50dp</dimen>

Затем в вашем файле res / layout / your_layout.xml включите

        <Button  
         android:layout_width="@dimen/your_button_width"  />

Тогда внутри вашего Java-файла:

int buttonSize= (int) (context.getResources().getDimension(R.dimen.your_button_width));
Автор: Gene Размещён: 12.12.2014 10:52

3 плюса

320 Репутация автора

Более простой способ:

view.post(new Runnable() {
    public void run() {
        view.getWidth();
    }
}
);

http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)

Автор: Wonson Размещён: 28.07.2015 01:55

0 плюса

1468 Репутация автора

Используйте код ниже:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus);
   Log.e("WIDTH",""+view.getWidth());
   Log.e("HEIGHT",""+view.getHeight());
}
Автор: Asif Patel Размещён: 10.02.2017 08:04
Вопросы из категории :
32x32