Макет менеджера в стиле USE_ALL_HEIGHT без переопределения sublayout () в BlackBerry - PullRequest
1 голос
/ 04 марта 2012

Я хочу расположить три VerticalFieldManager на экране с NO_VERTICAL_SCROLL.Один менеджер должен быть выровнен по TOP, один - по BOTTOM, а последний должен занимать оставшуюся часть высоты между двумя первыми.

Может ли это быть достигнуто без переопределения sublaout() для любого менеджера?Результат, которого я хочу достичь:

enter image description here


Я наложил этот экран следующим кодом.Проблема в том, что я не смог сделать это без переопределения sublayout ().

public class LayoutSandboxScreen extends MainScreen {
    public LayoutSandboxScreen() {
        super(NO_VERTICAL_SCROLL);

        VerticalFieldManager vfmTop = new VerticalFieldManager(USE_ALL_WIDTH);
        vfmTop.setBackground(BackgroundFactory.createSolidBackground(Color.GREEN));
        vfmTop.add(new ButtonField("TOP", FIELD_HCENTER));

        final VerticalFieldManager vfmCenter = new VerticalFieldManager(USE_ALL_WIDTH);       
        HorizontalFieldManager hfmCenter = new HorizontalFieldManager(USE_ALL_HEIGHT | FIELD_HCENTER);
        vfmCenter.setBackground(BackgroundFactory.createSolidBackground(Color.RED));
        hfmCenter.add(new ButtonField("CENTER", FIELD_VCENTER));
        vfmCenter.add(hfmCenter);

        final VerticalFieldManager vfmBottom = new VerticalFieldManager(USE_ALL_WIDTH);       
        vfmBottom.setBackground(BackgroundFactory.createSolidBackground(Color.BLUE));
        final ButtonField btn = new ButtonField("BUTTOM", FIELD_HCENTER);        
        vfmBottom.add(btn);

        VerticalFieldManager vfmSecond = new VerticalFieldManager(USE_ALL_HEIGHT) { 
            protected void sublayout(int maxWidth, int maxHeight) {
                setExtent(maxWidth, maxHeight);

                layoutChild(vfmBottom, maxWidth, maxHeight);
                int bottomHeight = vfmBottom.getHeight();

                layoutChild(vfmCenter, maxWidth, maxHeight - bottomHeight);
                setPositionChild(vfmCenter, 0, 0);

                setPositionChild(vfmBottom, 0, maxHeight - bottomHeight);
            }
        };

        vfmSecond.add(vfmBottom);
        vfmSecond.add(vfmCenter);

        add(vfmTop);
        add(vfmSecond);
    }
}

1 Ответ

1 голос
/ 04 марта 2012

Поскольку вы уже используете MainScreen, пытались ли вы использовать setTitle () и setStatus () для верхнего и нижнего VerticalFieldManager? Я думаю, что будет делать то, что вы хотите.

Редактировать

Если MainScreen слишком специфичен, вы можете написать свой собственный MainManager, который поддерживает те же компоненты макета, что и MainScreen - баннер, заголовок, основной контент, статус. Вы должны будете написать свой собственный код компоновки, так что вы все равно будете реализовывать sublayout (), чего вы специально хотели избежать. Плюсом является то, что это будет более компонованным - вы не будете переопределять метод sublayout () специальным образом для случайных компонентов пользовательского интерфейса.

...