web-dev-qa-db-ja.com

getMeasuredWidthが完全に間違った値を返す

他の人の間隔を空けるためにViewを測定する必要があります。私はそのためにこのコードを使用します:

_ViewGroup view = ...;
view.setPadding(10, 0, 10, 0);
int wrapContent = RelativeLayout.LayoutParams.WRAP_CONTENT;
int specWidth = MeasureSpec.makeMeasureSpec(wrapContent, MeasureSpec.AT_MOST);
view.measure(specWidth, specWidth);
int questionWidth = view.getMeasuredWidth();
_

これは、Android 4.3エミュレーターで期待どおりに機能します。

ただし、Samsung Galaxy XCover 2(S7710)で返された測定幅Android 4.1.2電話、は16777214 ...私はすべてを試しました。_View.MEASURED_SIZE_MASK_、しかし何も助けにはならなかった。

これについて助けていただけますか?前もって感謝します!

27
WonderCsabo

実際の値の代わりに_WRAP_CONTENT_をmakeMeasureSpec()に渡しても効果はありません。これらを一緒に使用することを意図したものではないと思いますが、.

_MeasureSpec.AT_MOST_モード(基本的にMath.min())で、最初のパラメーター(親ビューのサイズや画面の寸法など)として実際の制約値を使用します。引数は仕様に入力した値です。およびビューの目的の寸法。

_MeasureSpec.EXACTLY_は仕様値を使用し、_MeasureSpec.UNSPECIFIED_はビューの目的の値を使用します。したがって、制約がない場合(ビューをScrollViewに配置する場合など)、オプションは_MeasureSpec.UNSPECIFIED_-および最初の引数としての任意の値です。

そう、 {教祖、私が間違っている場合は私を訂正してください} _WRAP_CONTENT_以外のモードでは_MeasureSpec.EXACTLY_の動作が発生します

そうは言っても、試してみてください。

_ViewGroup view = ...;
view.setPadding(10, 0, 10, 0);
// Either this
int specWidth = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST);
// Or this
int specWidth = MeasureSpec.makeMeasureSpec(0 /* any */, MeasureSpec.UNSPECIFIED);
view.measure(specWidth, specWidth);
int questionWidth = view.getMeasuredWidth();
_

[〜#〜] ps [〜#〜]16777214、バイナリの数値を見てください: https://www.google.ru/search?q=16777214+in+binary それは-2(これは_LayoutParams.WRAP_CONTENT_の定数値です)が、論理演算で切り捨てられた最上位8ビット(したがってマイナスなし)では、measure()のコールスタックに何かがあります。それはこれを行います:)これはバグかどうか疑問に思います。多分それは否定的であり、例外か何かを投げるために議論をチェックするべきです。

60
Ivan Bartsov