Как создать настраиваемые LayoutParams для использования в пользовательском макете?

Я достаточно разбираюсь в создании сложных пользовательских макетов на основе ViewGroup. Единственное, чего мне не хватает, это возможность создавать мои собственные LayoutParams. Мне действительно нужна возможность получить поля и почему бы не создать другие дополнительные параметры для перехода к родительскому.

Как я могу создать пользовательский LayoutParam и использовать его через xml? Я попытался использовать LinearLayout.LayoutParam, но он, очевидно, сбой, поскольку родительский элемент не является LinearLayout. Как я могу работать с LayoutParams на пользовательских макетах?

Update:

На данный момент я придерживаюсь использования FrameLayout и переопределения функций onMeasure и onLayout, чтобы сделать сам макет. Это обеспечивает FrameLayout.LayoutParams. Я предполагаю, что ребенку придется поддерживать пользовательский LayoutParam?

Ответ 1

В своем пользовательском макете создайте вложенный класс, расширяющий ViewGroup.LayoutParams. Затем переопределите некоторые методы (все необходимые в моем примере). Здесь урезанная версия одного из моих собственных макетов:

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!)