LabelField отличается поведением между OS 4.5 и 6.0
В моем приложении мне пришлось реализовать пользовательский компонент, который расширен от VerticalFieldManager, и этот менеджер содержит строки, которые являются HorizontalFieldManager. Проблема в OS 4.5. LabelField слева показывает только одну строку текста. Вот код и изображения.
class Row extends HorizontalFieldManager{
private LabelField key;
private LabelField value;
public Row(String left,String right){
key = new LabelField(left + ": ",Field.NON_FOCUSABLE | Field.NON_SPELLCHECKABLE | TextField.NO_LEARNING | RichTextField.USE_TEXT_WIDTH){
public int getPreferredWidth() {
return Math.min((Display.getWidth()-20)/2,super.getPreferredWidth());
}
};
key.setPadding(0, 0, 0, 10);
key.setFont(Fonts.NORMAL);
add(key);
value = new LabelField(right,Field.NON_SPELLCHECKABLE | TextField.NO_LEARNING | Field.FOCUSABLE);
value.setPadding(0, 10, 0, 0);
value.setFont(Fonts.BOLD);
add(value);
}
public int getPreferredHeight() {
return Math.max(key.getHeight(), value.getHeight());
}
public int getPreferredWidth() {
return Display.getWidth()-20;
}
protected void sublayout(int arg0, int arg1) {
super.sublayout(arg0, arg1);
setExtent(getPreferredWidth(), getPreferredHeight());
}
}
1 ответ
Решение
Я решил проблему, поместив LabelFields в VFM и переопределив getPreferredHeight()
а также sublayout()
методы, как показано ниже. Спасибо Mister Smith.
class Row extends HorizontalFieldManager{
private LabelField key;
private LabelField value;
public Row(String left,String right){
VerticalFieldManager leftVfm = new VerticalFieldManager(){
public int getPreferredWidth() {
return Math.min(getField(0).getPreferredWidth(), (Display.getWidth())/2);
}
protected void sublayout(int maxWidth, int maxHeight) {
super.sublayout(getPreferredWidth(), maxHeight);
setExtent(getPreferredWidth(), maxHeight);
}
};
VerticalFieldManager rightVfm = new VerticalFieldManager();
key = new LabelField(label.getLabel() + ": ",Field.FOCUSABLE);
key.setFont(Fonts.NORMAL);
leftVfm.add(key);
value = new LabelField(label.getRight(),Field.FOCUSABLE);
value.setFont(Fonts.BOLD);
rightVfm.add(value);
add(leftVfm);
add(rightVfm);
}
public int getPreferredHeight() {
if (key != null)
return Math.max(key.getHeight(), value.getHeight());
else{
return value.getHeight();
}
}
public int getPreferredWidth() {
return Display.getWidth()-20;
}
protected void sublayout(int arg0, int arg1) {
super.sublayout(arg0, arg1);
setExtent(getPreferredWidth(), getPreferredHeight());
}
}