OnResumeのレイアウトでgetMeasuredWidth()またはgetWidth()を呼び出すと、0が返されます。この時点ではまだ表示されていないと思います。
また、レイアウトが描画され、ビューの測定値がわかった後に呼び出されるコールバックメソッドにgetMeasuredWidth()またはgetWidth()を配置する必要があると思います。何Androidコールバックメソッドを使用する必要がありますか?
システムがレンダリングする前にwidth
でheight
/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();
...
}
});
この答え 言う:
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();
}
});
}
ビューで onLayout() をオーバーライドできます。これはAndroidによって使用され、ビューに含まれる各子を配置します。したがって、super(..)
呼び出しの後に、そこでやりたいことを行うことができます。
実際、画面にレイアウトが表示されていない場合、getWidth()メソッドは0を返します。getMeasuredWidth()またはgetMesuredHeight()を呼び出す前にmeasure()メソッドを呼び出すのがうまくいくようです。 measureメソッドでは、Layout.WRAP_CONTENT引数を使用して、レイアウトに含まれるものの測定値を取得しました。
これが役立つことを願って、ミハイ
より簡単な方法:
view.post(new Runnable() {
public void run() {
view.getWidth();
}
}
);
http://developer.Android.com/reference/Android/view/View.html#post(Java.lang.Runnable)
解決策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));
以下のコードを使用:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.e("WIDTH",""+view.getWidth());
Log.e("HEIGHT",""+view.getHeight());
}