onMeasure()
カスタムビューを親から提供されるレイアウト制約に依存させる大きさをAndroidに伝える機会です。また、これらのレイアウト制約が何であるかを学習するカスタムビューの機会でもあります(あるmatch_parent
状況で別の動作をしたい場合wrap_content
)。これらの制約はMeasureSpec
、メソッドに渡される値にパッケージ化されます。次に、モード値の大まかな相関関係を示します。
- EXACTLYは、
layout_width
or layout_height
値が特定の値に設定されたことを意味します。あなたはおそらくあなたの見解をこのサイズにするべきです。これは、match_parent
が使用されたときにトリガーされ、サイズを親ビューに正確に設定することもできます(これはフレームワークのレイアウトに依存します)。
- AT_MOSTは、典型的には意味
layout_width
またはlayout_height
値に設定されたmatch_parent
、またはwrap_content
最大サイズが必要とされる(これはレイアウトフレームワークに依存している)、親寸法の大きさの値です。このサイズより大きくないでください。
- UNSPECIFIEDは通常、
layout_width
or layout_height
値がwrap_content
制限なしに設定されたことを意味します。あなたが好きなサイズにすることができます。一部のレイアウトでは、このコールバックを使用して目的のサイズを把握してから、2番目のメジャーリクエストで実際にどのスペックを渡すかを決定します。
で存在する契約onMeasure()
IS setMeasuredDimension()
なければなりません。あなたはビューがなりたいサイズで最後に呼び出され。このメソッドは、にあるデフォルトの実装を含むすべてのフレームワーク実装によって呼び出されます。そのため、ユースケースに適合する場合は、代わりView
に呼び出す方が安全super
です。
確かに、フレームワークはデフォルトの実装を適用しているため、このメソッドをオーバーライドする必要はないかもしれませんが、そうでない場合や、wrap_content
両方の方向のカスタムビューでは、フレームワークがその大きさを認識していないため、ビューがまったく表示されない場合があります。
一般に、View
別の既存のウィジェットではなくオーバーライドしている場合は、次のような単純な実装であっても、実装を提供することをお勧めします。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 100;
int desiredHeight = 100;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
//MUST CALL THIS
setMeasuredDimension(width, height);
}
お役に立てば幸いです。