13

私は、ViewGroupに基づいて複雑なカスタムレイアウトを作成するのにかなり熟練しています。私が見逃しているのは、カスタムLayoutParamsを作成する機能だけです。私は本当にマージンを取得する機能が必要であり、親に渡すために他の追加のパラメータを作成してみませんか。

カスタムLayoutParamを作成し、xml経由で使用するにはどうすればよいですか?LinearLayout.LayoutParamを使用してみましたが、親がLinearLayoutではないため、明らかにクラッシュしています。カスタムレイアウトでLayoutParamsを使用するにはどうすればよいですか?

アップデート:

今のところ、FrameLayoutを使用し、onMeasure関数とonLayout関数をオーバーライドして自分でレイアウトを行うことに固執しています。これはFrameLayout.LayoutParamsを提供します。子供たちはカスタムLayoutParamをサポートする必要があると思いますか?

4

1 に答える 1

21

カスタムレイアウトで、を拡張するネストされたクラスを作成しますViewGroup.LayoutParams。次に、いくつかのメソッドをオーバーライドします(必要なメソッドはすべて私の例にあります)。これが私のカスタムレイアウトの1つの簡略版です:

public class MyLayout extends ViewGroup {

    public MyLayout(Context context) {

    }

    public MyLayout(Context context, AttributeSet attrs) {

    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    }

    @Override
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
        return p instanceof LayoutParams;
    }

    @Override
    protected LayoutParams generateDefaultLayoutParams() {
        return new LayoutParams();
    }

    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new LayoutParams(getContext(), attrs);
    }

    @Override
    protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
        return generateDefaultLayoutParams(); // TODO Change this?
    }

    public static class LayoutParams extends ViewGroup.LayoutParams {

        public LayoutParams() {

        }

        public LayoutParams(int width, int height) {

        }

        public LayoutParams(Context context, AttributeSet attrs) {

        }

    }

}

詳細な説明:FlowLayoutを作成する方法(リンクLuksprogに感謝します!)

于 2012-08-15T17:26:19.730 に答える