Не удается заставить 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")));
Получили требуемый вид ровно после того, как свойства были правильно обработаны.