Не удается заставить GridLayout и GridLayoutParser работать с протейсом

Я пытаюсь надуть GridLayout в FrameLayout используя Proteus.

Я пытался реализовать GridLayoutParser а также GridLayout как предложено здесь - GridLayout поддерживается Proteus? Если нет, то какова альтернатива?,

Вот что я попробовал -
Посмотреть -

public class ProteusGridLayout extends GridLayout implements ProteusView {
    private ProteusViewManager viewManager;

    public ProteusGridLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ProteusGridLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ProteusGridLayout(Context context) {
        super(context);
    }

    public ProteusGridLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public ProteusViewManager getViewManager() {
        return viewManager;
    }

    @Override
    public void setViewManager(ProteusViewManager proteusViewManager) {
        viewManager = proteusViewManager;
    }
}

Парсер -

public class ProteusGridLayoutParser extends WrappableParser<ProteusGridLayout> {

    public ProteusGridLayoutParser(Parser<ProteusGridLayout> wrappedParser) {
        super(wrappedParser);
    }

    @Override
    public ProteusView createView(ViewGroup parent, JsonObject layout, JsonObject data, Styles styles, int index) {
        return new ProteusGridLayout(parent.getContext());
    }
}

Данные Proteus JSON, которые я пытался представить -

{
    "type": "GridLayout",
    "layout_width": "match_parent",
    "layout_height": "match_parent",
    "layout_gravity": "fill_horizontal",
    "columnCount": "2",
    "useDefaultMargins": "true",
    "children": [{
            "type": "TextView",
            "layout_width": "wrap_content",
            "layout_height": "wrap_content",
            "layout_columnWeight": "1",
            "layout_marginTop": "8dp",
            "layout_marginLeft": "16dp",
            "textSize": "20dp",
            "textColor": "@android:color/background_dark",
            "text": "244536"
        },
        {
            "type": "TextView",
            "layout_width": "wrap_content",
            "layout_height": "wrap_content",
            "layout_columnWeight": "1",
            "layout_marginTop": "8dp",
            "layout_marginLeft": "16dp",
            "textSize": "20dp",
            "textColor": "@android:color/background_dark",
            "text": "244536"
        },
        {
            "type": "TextView",
            "layout_width": "wrap_content",
            "layout_height": "wrap_content",
            "layout_columnWeight": "1",
            "layout_marginTop": "8dp",
            "layout_marginLeft": "16dp",
            "textSize": "20dp",
            "textColor": "@android:color/background_dark",
            "text": "244536"
        }
    ]
}

Я получаю это в logcat - D/android.widget.GridLayout: horizontal constraints: x3-x0>=660, x3-x2<=164, x2-x1<=164, x1-x0<=164 are inconsistent; permanently removing: x3-x2<=164., GridLayout не отображается правильно, и три элемента отображаются в одной строке, как LinearLayout.

1 ответ

Решение

Решил это. ProteusGridLayoutParser отсутствовал следующий метод для обработки GridLayout специфические свойства -

@Override
    protected void prepareHandlers() {
        super.prepareHandlers();
        this.addHandler(new Attributes.Attribute("columnCount"), new AttributeProcessor<ProteusGridLayout>() {
            @Override
            public void handle(String s, JsonElement jsonElement, ProteusGridLayout proteusGridLayout) {
                proteusGridLayout.setColumnCount(jsonElement.getAsInt());
            }
        });
        this.addHandler(new Attributes.Attribute("useDefaultMargins"), new AttributeProcessor<ProteusGridLayout>() {
            @Override
            public void handle(String s, JsonElement jsonElement, ProteusGridLayout proteusGridLayout) {
                proteusGridLayout.setUseDefaultMargins(jsonElement.getAsBoolean());
            }
        });
    }

Для того, чтобы справиться с layout_columnWeight собственность для TextView Я реализовал следующий класс, переопределяя уже предоставленный TextViewParser -

public class CustomProteusTextViewParser extends TextViewParser<ProteusTextView> {
    public CustomProteusTextViewParser(Parser<ProteusTextView> wrappedParser) {
        super(wrappedParser);
    }

    @Override
    public ProteusView createView(ViewGroup parent, JsonObject layout, JsonObject data, Styles styles, int index) {
        return new ProteusTextView(parent.getContext());
    }

    @Override
    protected void prepareHandlers() {
        super.prepareHandlers();

        this.addHandler(new Attributes.Attribute("layout_columnWeight"), new AttributeProcessor<ProteusTextView>() {
            @Override
            public void handle(String s, JsonElement jsonElement, ProteusTextView proteusTextView) {
                GridLayout.LayoutParams layoutParams = (GridLayout.LayoutParams) proteusTextView.getLayoutParams();
                layoutParams.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, jsonElement.getAsFloat());
                proteusTextView.setLayoutParams(layoutParams);
            }
        });
    }
}

И наконец зарегистрировал этот парсер как обработчик TextView -

LayoutBuilder layoutBuilder = new LayoutBuilderFactory().getDataParsingLayoutBuilder();
layoutBuilder.registerHandler("TextView", new CustomProteusTextViewParser((Parser) layoutBuilder.getHandler("View")));

Получили требуемый вид ровно после того, как свойства были правильно обработаны.

Другие вопросы по тегам