2012-02-08 3 views
0

В моем приложении мне пришлось реализовать пользовательский компонент, который расширен от VerticalFieldManager, и этот менеджер содержит строки, которые являются HorizontalFieldManager. Проблема в OS 4.5 LabelField слева показывает только одну строку текста. Вот код и изображения. BB6.0 enter image description hereLabelField различное поведение между OS 4.5 и 6.0

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()); 
    } 
} 
+0

Поместите свои «LabelFields» внутри «VerticalFieldManagers», а затем добавьте их в «HorizontalFieldManager» каждой строки. Кстати, почему вы используете 'RichTextField.USE_TEXT_WIDTH' в ярлыке ключа? LabelField не распространяется от rtf, поэтому он может дать неожиданные результаты. То же самое с 'TextField.NO_LEARNING'. –

+0

С использованием только стилей 'Field.NON_FOCUSABLE' и' Field.FOCUSABLE' и размещения LabelFields внутри VFM, я попытался и получил тот же результат. –

+0

Конечно, это не имеет ничего общего с этими флагами. Проблема в том, что ребята из RIM меняют поведение с каждой версией. –

ответ

1

Я решил проблему путем размещения внутри LabelFields ГФП и отменяют 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()); 
    } 
}