1

我需要在 BlackBerry 中进行如下自定义布局。

在此处输入图像描述

我在Android中做了同样的布局。现在我需要在 BlackBerry 中使用相同的布局。我是 BlackBerryapp 开发的新手。像 Android 中的FieldsBlackBerryViews对我来说似乎很令人困惑。

我尝试使用VerticalFieldManager&HorizontalFieldManager通过将这些与BitmapField&混合LabelField来生成我的布局。

我特别失败了放置LabelField在屏幕底部。我用USE_ALL_HEIGHT&FIELD_BOTTOM样式放在底部,但滚动很长时间后才显示。

我的要求是当我的中间列表滚动时页眉和页脚不应该滚动

4

1 回答 1

2

添加不随屏幕中间内容滚动的页眉和页脚字段的最简单方法是使用MainScreen#setBanner()and 。这MainScreen#setStatus()是一个示例:

public class HeaderFooterListScreen extends MainScreen {

   private static final int BG_COLOR = Color.BLACK;
   private static final int HIGHLIGHT_COLOR = Color.BLUE;
   private static final int FONT_COLOR = Color.WHITE;
   private static final int ROW_HEIGHT = 60;

   private Object[] _rowData;
   private Field _header;
   private Field _footer;
   private Field _spacer;
   private int _orientation;

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

      Background bg = BackgroundFactory.createSolidBackground(BG_COLOR);
      setBackground(bg);
      getMainManager().setBackground(bg);

      // header
      Bitmap headerImg = Bitmap.getBitmapResource("header.png");
      _header = new BitmapField(headerImg);
      setBanner(_header);

      // list
      _rowData = new Object[] { "row one", "row two", "row three" }; //, "row four", "row five", "row six", "row seven", "row eight", "row nine", "row ten" };
      ListField list = new ListField();
      int c = Color.RED;
      XYEdges edgeColors = new XYEdges(c, c, c, c);
      XYEdges edgeThicknesses = new XYEdges(5, 5, 5, 5);
      list.setBorder(BorderFactory.createSimpleBorder(edgeThicknesses, edgeColors, Border.STYLE_SOLID));
      list.setCallback(new CustomListFieldCallback());
      list.setRowHeight(ROW_HEIGHT);
      list.setSize(_rowData.length);

      add(list);

      // footer
      _footer = new LabelField("Footer Showing Status As Text", Field.USE_ALL_WIDTH | DrawStyle.HCENTER) {
         public void paint(Graphics g) {
            // change font color
            int oldColor = g.getColor();
            g.setColor(FONT_COLOR);
            super.paint(g);
            g.setColor(oldColor);
         }
      };
      _footer.setFont(_footer.getFont().derive(Font.PLAIN, 24));
      setStatus(_footer);
   }    

   private void centerList() {
      if (_spacer != null && _spacer.getManager() != null) {
         // delete the old spacer field, if there was one      
         delete(_spacer);     
      }
      int listHeight = _rowData.length * ROW_HEIGHT;
      int availableHeight = getHeight() - _footer.getHeight() - _header.getHeight(); 
      if (availableHeight > listHeight) {
         boolean firstRun = (_spacer == null);
         // add a spacer above the list to force it down enough to be centered
         final int SPACE = (availableHeight - listHeight) / 2;         
         _spacer = new Field() {
            protected void layout(int width, int height) {
               setExtent(width, SPACE);              
            }
            protected void paint(Graphics graphics) {            
            }            
         };
         insert(_spacer, 0); 
         if (firstRun) {
            getMainManager().setVerticalScroll(0);
         }
      }
   }   

   // called when device orientation changes
   protected void sublayout(int width, int height) {
      super.sublayout(width, height);

      if (_orientation != Display.getOrientation()) {
         _orientation = Display.getOrientation();

         // run with invokeLater() to avoid recursive sublayout() calls
         UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
               // TODO: may have to adjust header, too?
               centerList();
            }
         });
      }
   }

   private class CustomListFieldCallback implements ListFieldCallback {

      private final int PAD = 10;

      public void drawListRow(ListField listField, Graphics graphics,
            int index, int y, int width) {

         int oldColor = graphics.getColor();
         if (listField.getSelectedIndex() == index) {
            graphics.setColor(HIGHLIGHT_COLOR);
         } else {
            graphics.setColor(BG_COLOR);
         }
         graphics.fillRect(0, y, width, listField.getRowHeight());

         graphics.setColor(FONT_COLOR);
         String text = (String)get(listField, index);               
         graphics.drawText(text, PAD, y + PAD, DrawStyle.LEFT);

         graphics.setColor(oldColor);
      }

      public Object get(ListField listField, int index) {
         return _rowData[index];
      }

      public int getPreferredWidth(ListField listField) {         
         return Display.getWidth();
      }

      public int indexOfList(ListField listField, String prefix, int start) {         
         return -1;  // TODO?
      }
   }
}

你没有具体说明你希望中间的列表如何工作,所以我只是做了一些猜测。我也不确定红色边框是你想要的,还是你用来描述布局的东西。如果您对列表有更多要求,请编辑您的问题或发布新问题。

字段概念

如果您来自 Android,并且不清楚 BlackBerry UI 类(如Fields和)的作用Managers,这里有一些资源:

结果

在此处输入图像描述

于 2013-07-18T21:37:51.137 回答