多数の子ビューを持つ RelativeLayout ルートを持つ XML ファイルで定義されたカスタム レイアウトがあります。
ここで、次のクラスを定義しました。
public class MyCustomView extends RelativeLayout {
public MyCustomView(Context context) {
super(context);
init();
}
public MyCustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.my_custom_view, this, true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Log.d("Widget", "Width spec: " + MeasureSpec.toString(widthMeasureSpec));
Log.d("Widget", "Height spec: " + MeasureSpec.toString(heightMeasureSpec));
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int chosenWidth = chooseDimension(widthMode, widthSize);
int chosenHeight = chooseDimension(heightMode, heightSize);
int chosenDimension = Math.min(chosenWidth, chosenHeight);
setMeasuredDimension(chosenDimension, chosenDimension);
}
private int chooseDimension(int mode, int size) {
if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.EXACTLY) {
return size;
} else {
return getPreferredSize();
}
}
private int getPreferredSize() {
return 400;
}
}
ご覧のとおり、ルートをMyCustomView
インスタンスに設定し、アタッチ フラグを true に設定しています。
私が達成したいのは、このカスタム ビューを別のレイアウトの xml に追加するとMyCustomView
、XML で定義されたレイアウトを持つクラスがインスタンス化されることです。
私はすでに<merge>
タグを使用しようとしていますが、そうすると、子ビューを XML で必要に応じて配置できなくなります。
また、XML を膨張させてビューとして に追加しようとしましたMyCustomView
が、その方法では冗長になりますRelativeLayout
。
最後にonMeasure()
、完全を期すために を追加しました。