2013-11-22 28 views
1

我想創建一組常見問題解答並在VFM中使用一堆LabelFields。問題是,當我嘗試滾動時,它跳轉到列表的底部,並沒有顯示中間部分的問題。黑莓verticalfieldmanager部分屏幕滾動與標籤字段

public class HelpTab implements ITabAreaLayout, ScrollChangeListener { 

    public String[] GetQandAs() { 
     String[] QandAs = new String[22]; 

     QandAs[0] = "Q. ...."; 
     QandAs[1] = "A. ...."; 
     .... 
     .... 
     QandAs[20] = "Q. ..."; 
     QandAs[21] = "A. ...."; 

     return QandAs; 
    } 

    VerticalFieldManager _vfm; 

    public VerticalFieldManager GetLayout() { 
     _vfm = new VerticalFieldManager(Field.FIELD_LEFT 
       | Manager.VERTICAL_SCROLL | Manager.VERTICAL_SCROLLBAR); 

     _vfm.add(UIElements.GetTitleArea(" ? FAQ")); 

     String[] QandAs = GetQandAs(); 

     for (int i = 0; i < QandAs.length; i++) { 
      LabelField lblQandA = null; 

      if ((i % 2) == 0) { 
       lblQandA = UIElements.GetQuestionLabel(QandAs[i]); 
      } else { 
       lblQandA = UIElements.GetAnswerLabel(QandAs[i]); 
      } 

      _vfm.add(lblQandA); 
     } 

     _vfm.add(new NullField(NullField.FOCUSABLE)); // for scrolling 

     return _vfm; 

    } 

    public void scrollChanged(Manager manager, int newHorizontalScroll, 
      int newVerticalScroll) { 

     if (_vfm != null){ 
      _vfm.setVerticalScroll(newVerticalScroll); 
     } 
    } 

    public class HomeScreen extends MainScreen 
    { 

    public HomeScreen() { 

     super(Manager.FIELD_HCENTER | Screen.NO_VERTICAL_SCROLL); 

     _vfmMain = new VerticalFieldManager(); 

     // add header image 
     _vfmMain.add(UIElements 
       .GetBitmapField(UIElements.IMG_HEADER, false)); 

     // add tab strip 
     _vfmMain.add(MakeTabStrip()); 

     add(_vfmMain); 

     _vfmTabArea = new HelpTab().GetLayout(); 

     add(_vfmTabArea); 


    } 
} 

我沒能找到setVerticalScroll使用多大的幫助,也許就是這個問題的原因。

請指教。

感謝

+1

除了Peter的建議,我不認爲你正在使用'ScrollChangeListener'。 'scrollChanged()'方法是管理員滾動的通知。你不需要通過調用'setVerticalScroll()'來實現滾動。滾動更改偵聽器旨在允許您在管理器滾動時添加自定義處理。例如,您可以選擇僅在用戶滾動靠近屏幕時才加載屏幕底部的圖像。在你的情況下,我認爲你可以完全移除'scrollChanged()'。焦點問題是分開的。 – Nate

+1

感謝您的解釋。我已經移除了聽衆並使用Signare的解決方案來解決問題。 –

回答

1

在你的代碼,你在循環的結束位置添加了可調焦的空場。所以如果你滾動,它會轉到最後一個元素。如果添加可調焦區域 - 在第一個問題之後,然後在第二個問題之後,.....所以它將逐個滾動。 試試這個代碼 -

for (int i = 0; i < QandAs.length; i++) { 
    LabelField lblQandA = null; 

    if ((i % 2) == 0) { 
     lblQandA = UIElements.GetQuestionLabel(QandAs[i]); 
    } else { 
     lblQandA = UIElements.GetAnswerLabel(QandAs[i]); 
    } 

    _vfm.add(lblQandA); 
    _vfm.add(new NullField(NullField.FOCUSABLE)); //after each element, add a focusable null field. 
} 
1

由於Signare指出,這裏的問題可能與您的LabelFields不是可聚焦的,這是他們是不是默認。一個答案是按照建議添加NullFields。不過,我懷疑你實際上希望這些內容是可以聚焦的,所以用戶可以點擊他們想要的更多信息。因此,請您LabelFields可聚焦,通過設置樣式,例如

LabelField lab = new LabelField("Label", LabelField.FOCUSABLE); 

或者,和我心中最好使用RichTextField代替的LabelField。這會讓你逐行滾動,LabelField專注於整個文本。

+0

謝謝。我嘗試過,但它使每個標籤突出顯示,所以我必須編寫代碼來修復高亮顏色。我結束了Signare的解決方案。 –