2013-02-16 75 views
2

我想生成一個具有非零邊距的VerticalFieldManager,所以我創建了VerticalFieldManager,然後使用vfm.setMargin(10,10,10,10);之後,在其中放入一些字段(buttonField,ObjectChoiceField)。將邊距設置爲VerticalFieldManager時發生奇怪的事情

這似乎太簡單了吧?但奇怪的事情發生。當我將注意力集中在最後的ObjectChoiceField並按空格切換選擇時,ObjectChoiceField消失。

這怎麼可能?這裏是演示代碼,任何人都會發現錯誤?

final class HelloWorldScreen extends MainScreen{ 
    HelloWorldScreen() { 
    // just a demo to show the strange thing 
    String [] arr = {"a","b"}; 
    for(int i = 0; i < 10; i++){ 

     VerticalFieldManager vfm = new VerticalFieldManager(); // Field.USE_ALL_WIDTH 
     vfm.setMargin(10, 10, 10, 10); 
     ButtonField btn = new ButtonField(String.valueOf(i)); 
     ObjectChoiceField ch = new ObjectChoiceField(String.valueOf(i), arr); 

     vfm.add(btn); 
     vfm.add(ch); 

     add(vfm); 
    } 
    } 
} 

編輯:截圖所需的UI利潤率:

enter image description here

+0

+1一個小的,獨立的例子,重現您的問題:) – Nate 2013-02-16 11:56:51

回答

1

這很奇怪。

對於那些誰不運行代碼的好處,有什麼情況是,當你點擊對象的選擇領域,整個屏幕垂直滾動一點點。每次垂直滾動後,屏幕都會失去滾動到底部的能力。在許多這樣的操作之後,最終該屏幕的較低部分不再可用。

我不知道爲什麼會這樣。(看起來像黑莓的錯誤給我)

我觀察到的是,如果你把調用

vfm.setMargin(10, 10, 10, 10); 

問題消失。

我建議在您使用

vfm.setPadding(10, 10, 10, 10); 

,而不是一個解決方法嗎?

我知道保證金填充不是一回事。然而,根據你的完整的UI設計(我看不到),在這種情況下,,設置一個10像素的填充可能足以做你想做的事情。


更新:根據您所需的UI截圖,我是能夠產生與此解決辦法。再次,它不應是這麼多的工作,但是這額外的代碼爲我工作:

public class BugScreen extends MainScreen { 

    private static final int BG_COLOR = Color.LIGHTGRAY; 
    private static final int FG_COLOR = Color.WHITE; 
    private static final int BORDER_LINE_COLOR = Color.GRAY; 
    private static final int PAD = 10; 

    public BugScreen() { 
     super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR); 

     getMainManager().setBackground(BackgroundFactory.createSolidBackground(BG_COLOR)); 
     // this additional call ensures that when scrolling bounces, the area "behind" 
     // the normal visible area is ALSO of BG_COLOR 
     setBackground(BackgroundFactory.createSolidBackground(BG_COLOR)); 

     // this will establish a thin gray padding on the screen's left/right sides 
     // NOTE: I seem to get drawing artifacts if I try to use this for ALL sides! 
     getMainManager().setPadding(0, PAD, 0, PAD); 

     String [] arr = {"a","b"}; 
     for(int i = 0; i < 10; i++){ 

     VerticalFieldManager vfm = new VerticalFieldManager(Field.USE_ALL_WIDTH) { 
      public int getPreferredWidth() { 
       return Display.getWidth() - 2 * PAD; 
      } 
      public void paint(Graphics graphics) { 
       int oldColor = graphics.getColor(); 
       super.paint(graphics); 
       graphics.setColor(BORDER_LINE_COLOR); 
       // draw the (1-pixel wide) border size you would like. 
       graphics.drawRect(0, 0, getPreferredWidth(), getHeight()); 
       graphics.setColor(oldColor); 
      } 
     }; 

     vfm.setBackground(BackgroundFactory.createSolidBackground(FG_COLOR)); 
     ButtonField btn = new ButtonField(String.valueOf(i)); 
     ObjectChoiceField ch = new ObjectChoiceField(String.valueOf(i), arr); 

     vfm.add(btn); 
     vfm.add(ch); 

     // add a separator field to get thin gray margin between (vfm) fields   
     add(new MarginField()); 

     add(vfm); 
     } 

     // add one last margin field at the bottom 
     add(new MarginField()); 
    } 

    private class MarginField extends Field { 
     public MarginField() { 
     super(Field.USE_ALL_WIDTH); 
     } 
     public int getPreferredHeight() { return PAD; } 
     protected void paint(Graphics g) { 
     int oldColor = g.getColor(); 
     g.setColor(BG_COLOR); 
     g.fillRect(0, 0, getWidth(), getPreferredHeight()); 
     g.setColor(oldColor); 
     } 
     protected void layout(int width, int height) { 
     setExtent(width, getPreferredHeight());    
     }  
    } 
} 
+0

嗨奈特,它是那麼善良的人試圖描述如此詳細的問題。非常感謝! – user1618533 2013-02-16 13:01:40

+0

嗨Nate,這是你好,試圖描述如此詳細的問題。非常感謝! (對不起,我不知道如何開始一個新行)那麼,我使用該代碼是因爲我想要這樣製作UI,http://www.pocketberry.com/wp-content/uploads/2011/08 /video-options-os-7-1.jpg。你能看到「特徵」和「存儲」有狹窄和灰色的大腦嗎?起初我認爲它很簡單,只需使用verticalfieldmanager和setmargin即可。但它出來我錯了。也許有人有更好的想法做到這一點? – user1618533 2013-02-16 13:07:44

+0

謝謝你,我試過你的解決方案,它的效果很好。在此基礎上,我想到了一個新想法,下面的代碼可以爲我工作,並且看起來有點簡單: – user1618533 2013-02-17 10:26:26