BlackBerry - высота доступного экрана без полей баннера и заголовка - PullRequest
4 голосов
/ 30 мая 2011

Я хотел бы знать, сколько вертикальной недвижимости доступно моему менеджеру на экране (без прокрутки).

Я хотел бы иметь этого менеджера в отдельном классе, а не в подклассе Screen.В идеале мой менеджер мог бы быть размещен на любом экране, без знания особенностей экрана, передаваемого ему - этот менеджер мог бы выяснить, сколько места осталось неиспользованным в полях заголовка / баннера экрана.

Я могу получить размер экрана многими способами.Это легкая часть.Но он не учитывает поля заголовка / баннера.

Что я хотел бы знать, это как найти часть экрана, которая не покрыта полями заголовка или баннера?Но я хотел бы иметь общее решение, которое можно использовать в отдельном файле класса, без предварительного знания экрана, на котором он должен отображаться.

(обходной путь: я должен сказать своему менеджерукакова была высота полей заголовка / баннера, и затем я мог бы использовать эти высоты с Display.getHeight() для вычисления доступного пространства)

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

У меня есть отдельный класс (назовите его CobiPainter), который может использоваться любым менеджером или классом экрана - он реализует один метод, который я назвал paintBackground(Graphics g).Я вызываю этот метод из любого связанного paintBackground(Graphics g) переопределения экрана, фон которого я хочу нарисовать.

Для того, чтобы его можно было использовать любым MainScreen, с минимальными связями и дополнительной работой, ясделали так, чтобы класс CobiPainter мог вычислить, сколько экранов доступно, без необходимости знания полей заголовка / баннера / статуса.

Код, который я использовал, основан наДело в том, что у MainScreen есть внутренний менеджер, к которому мы обычно добавляем поля.Этот менеджер знает высоту, которую я ищу.

Это взломанный код / ​​код, который я использовал:

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, чтобы заставить его принять размер экрана (спасибо Химаншу).

0 голосов
/ 18 сентября 2012

То, что я делаю, является своего рода обходным решением неспособности системы предоставить эту информацию.

1) Расширьте все ваши экраны из класса BaseScreen. 2) При установке Banner (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 (int maxWidth, int maxHeight) вашего менеджера:

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

По своему опыту я также учитываю виртуальную клавиатуру и отступы менеджера при необходимости.

0 голосов
/ 30 мая 2011

Существует три полевых менеджера, таких как VerticalFieldManager, HorizontalFieldManager и FlowFieldManager, которые можно установить с помощью функции «Не прокручиваемый», как вертикально, так и горизонтально.Вы должны создать объект для горизонтального / вертикального FieldManager с параметром (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);
...