【问题标题】:BlackBerry - height of available screen excluding banner & title fields黑莓 - 可用屏幕的高度,不包括横幅和标题字段
【发布时间】:2012-09-18 15:32:25
【问题描述】:

我想知道我的经理在屏幕上可以使用多少垂直空间(无需滚动)。

我希望将此管理器放在一个单独的类中,而不是在 Screen 子类中。理想情况下,我的经理将能够被放置在任何屏幕上,而不需要传递给它的屏幕细节的任何知识 - 该经理将能够找出屏幕的标题/横幅字段未使用的空间。

我可以通过多种方法获取屏幕尺寸。那是容易的部分。但它没有考虑标题/横幅字段。

我想知道的是如何找到没有被任何标题或横幅字段覆盖的屏幕部分?但我想有一个通用的解决方案,可以在单独的类文件中使用,而无需事先了解要显示的屏幕。

(解决方法:我必须告诉我的经理标题/横幅字段的高度是多少,然后我可以使用这些高度和Display.getHeight() 来计算可用空间)

【问题讨论】:

    标签: user-interface blackberry screen


    【解决方案1】:

    我有一个单独的类(称为CobiPainter),它可以被任何管理器或屏幕类使用——它实现了一种我称为paintBackground(Graphics g) 的方法。我从要绘制其背景的屏幕的任何相关paintBackground(Graphics g) 覆盖中调用此方法。

    为了能够被任何MainScreen 使用,以最小的耦合和额外的工作,我已经做到了,以便CobiPainter 类能够计算有多少屏幕可用,而无需给出标题/横幅/状态字段的任何知识。

    我使用的代码依赖于MainScreen 有一个我们通常添加字段的内部管理器这一事实。这位经理知道我要找的高度。

    这是我使用的 hack/代码:

    Screen activeScreen = UiApplication.getUiApplication().getActiveScreen();
    if (activeScreen instanceof MainScreen)
    {
        // get available height excluding banner / title
        XYRect xy = ((MainScreen) activeScreen).getMainManager()
            .getExtent();
        heightOfTitleAndBanner = xy.y;  // <---- can be useful too
        availableHeight = xy.height;    // <---- this is what I wanted
    }
    

    在显示相关管理器之前,此代码将不起作用,因为它依赖于调用 getActiveScreen() 方法。它还要求MainScreen 是使用参数Manager.NO_VERTICAL_SCROLL 创建的,以强制它采用屏幕大小(感谢Himanshu)。

    【讨论】:

      【解决方案2】:

      共有三个字段管理器,如-VerticalFieldManager、Horizo​​ntalFieldManager 和 FlowFieldManager,可以设置为不可滚动、垂直和水平。 您必须使用参数 (Manager.NO_VERTICAL_SCROLL|Manager.NO_HORIZONTAL_SCROLL) 为水平/垂直 FieldManager 创建一个对象

      但您必须对其进行自定义以满足您的条件。

      如果您想知道标题大小,只需在水平/垂直字段管理器中添加包含,并分别使用 getPreferedHeight() 和 getPreferedWidth() 获取其高度或宽度。

      这里是粗略的代码:

      final LabelField field  = new LabelField("Himanshu")
              {
                  protected void layout(int width, int height) 
                  {
                      super.layout(width, height);
      //              setExtent(360, 50);
                  };
                  public int getPreferredHeight() 
                  {
                      return super.getPreferredHeight();
                  }
              };
              final LabelField field1  = new LabelField("Himanshu")
              {
                  protected void layout(int width, int height) 
                  {
                      super.layout(width, height);
      //              setExtent(360, 50);
                  };
                  public int getPreferredHeight() 
                  {
                      return super.getPreferredHeight();
                  }
              };
              setTitle(field);
              setStatus(field1);
              VerticalFieldManager fieldManager = new VerticalFieldManager(Manager.USE_ALL_WIDTH|Manager.NO_VERTICAL_SCROLL)
              {
                  protected void sublayout(int maxWidth, int maxHeight) 
                  {
                      super.sublayout(maxWidth, maxHeight);
                      this.setExtent(360, Display.getHeight()-(field.getPreferredHeight())-(field1.getPreferredHeight()));
                  }
              };
              fieldManager.setBackground(BackgroundFactory.createSolidBackground(Color.BLUE));
              System.out.println("-------------"+field.getPreferredHeight());
              add(fieldManager);
      

      【讨论】:

      • 不,我在该特定行上添加了注释,这里我得到了字段 20 px 的高度,使用 field.getPreferedHeight().U 应该检查它
      • thx - 我仍然无法让它以我想要的方式运行 - 也许我没有很好地解释。我再次更新了问题以指定我正在寻找一个可以从一个单独的类中使用的答案,该类对横幅/标题字段没有先验知识。理想情况下,我的代码不需要对标题字段的引用。您的 fieldManager 知道 fieldfield1 - 这是我试图避免的解决方法(如果可能的话)。
      【解决方案3】:

      我所做的是一种系统无法提供该信息的解决方法。

      1) 从 BaseScreen 类扩展所有屏幕。 2)在该类中设置横幅(setBanner())时,存储您放入的横幅实例。示例:

      public abstract class BaseScreen extends MainScreen
      {
          private StandardTitleBar titleBar;
      
          ...    // some initializer body, i.e. constructor
              titleBar = getStandardTitleBar();
              setBanner(titleBar);
          ...
      }
      

      3) 在 BaseScreen 类中显示设置横幅的高度/宽度

      public int getBannerHeight()
      {
          if (null == titleBar)
              return 0;
          else
              return titleBar.getHeight();
      }
      

      4) 在您的经理使用的受保护的 void sublayout(int maxWidth, int maxHeight) 内:

      int bannerHeight = ((BaseScreen) getScreen()).getBannerHeight();
      int titleHeight  = getScreen().getTitleBar().getHeight() // TODO: protect from null
      

      根据我的经验,我还会在必要时考虑虚拟键盘和管理器的填充。

      【讨论】:

        猜你喜欢
        • 2010-12-18
        • 2020-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        相关资源
        最近更新 更多