1

多数の子ビューを持つ 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()、完全を期すために を追加しました。

4

1 に答える 1

2

インフレーションは発生しますが、子ビューは表示されません

これRelativeLayoutは、レイアウトで行ったことよりも少し (多く) 行いonMeasureます (基本的に、子はコードでまったく測定されないため、表示するものはありません)。ViewGrouplikeを拡張する場合はRelativeLayout、そのクラスにそのコールバック( onMeasureonLayout) を実行させるか、少なくともメソッドを非常に注意深く複製し、必要に応じて変更する必要があります (何かを見たい場合)。

したがって、onMeasureメソッドを削除して子を表示するか、メソッドをオーバーライドした理由をより適切に説明してください。

于 2013-01-15T16:30:15.060 に答える