web-dev-qa-db-ja.com

onResumeのレイアウトでgetMeasuredWidth()またはgetWidth()を呼び出すと、0が返されます

OnResumeのレイアウトでgetMeasuredWidth()またはgetWidth()を呼び出すと、0が返されます。この時点ではまだ表示されていないと思います。

また、レイアウトが描画され、ビューの測定値がわかった後に呼び出されるコールバックメソッドにgetMeasuredWidth()またはgetWidth()を配置する必要があると思います。何Androidコールバックメソッドを使用する必要がありますか?

38
mobiledev Alex

システムがレンダリングする前にwidthheight/getMeasuredWidth/getMeasuredHeight/Viewを使用することはできません(通常はonCreate/onResume)。

このための簡単な解決策は、Runnableをレイアウトに投稿することです。実行可能ファイルは、Viewがレイアウトされた後に実行されます。

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

        ...
    }
});
78
Adorjan Princz

この答え 言う:

ViewTreeObserverViewを使用して、最初のレイアウトを待ちます。最初のレイアウトが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();
    }
  });
}
37
Jeff Axelrod

ビューで onLayout() をオーバーライドできます。これはAndroidによって使用され、ビューに含まれる各子を配置します。したがって、super(..)呼び出しの後に、そこでやりたいことを行うことができます。

5
MrJre

実際、画面にレイアウトが表示されていない場合、getWidth()メソッドは0を返します。getMeasuredWidth()またはgetMesuredHeight()を呼び出す前にmeasure()メソッドを呼び出すのがうまくいくようです。 measureメソッドでは、Layout.WRAP_CONTENT引数を使用して、レイアウトに含まれるものの測定値を取得しました。

これが役立つことを願って、ミハイ

4
r1k0

より簡単な方法:

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

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

3
Wonson

解決策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/dimens.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));
1
Gene

以下のコードを使用:

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