Если я вызываю getMeasuredWidth () или getWidth () для макета в onResume, они возвращают 0 - PullRequest
38 голосов
/ 04 августа 2011

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

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

Ответы [ 7 ]

77 голосов
/ 20 января 2013

Вы не можете использовать width / height / getMeasuredWidth / getMeasuredHeight на 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();

        ...
    }
});
36 голосов
/ 29 июля 2012

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

Используйте 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();
    }
  });
}
5 голосов
/ 04 августа 2011

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

4 голосов
/ 13 февраля 2012

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

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

3 голосов
/ 28 июля 2015

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

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

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

1 голос
/ 13 декабря 2014

Решение № 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));
0 голосов
/ 10 февраля 2017

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

@Override
public void onWindowFocusChanged(boolean hasFocus) {
   super.onWindowFocusChanged(hasFocus);
   Log.e("WIDTH",""+view.getWidth());
   Log.e("HEIGHT",""+view.getHeight());
}
...