Создание информационного/справочного экрана приложения на Blackberry

Я пытаюсь создать экран Help/About для своего приложения, но обнаружил, что мой код отстой. (Я знаю, что это может потребовать небольшого рефакторинга, но при работе с новым фреймворком я сначала получаю работающий код, а затем сразу же возвращаюсь и рефакторинг, чтобы сделать что-то «правильно»).

Во-первых, то, что я делаю, «не кажется» правильным. Я не уверен, что нужно просто вставить кучу текстовых полей в макет - есть ли лучший способ сделать это?

Во-вторых, VFM занимает большую часть экрана и нажимает кнопку «Закрыть» снизу. То, что я пытаюсь сделать, это сохранить заголовок и кнопку «Закрыть» видимыми, но просто прокрутить VFM.

Как я могу решить эти проблемы?

public class HelpScreen extends PopupScreen {
    public HelpScreen() {
        super(new VerticalFieldManager(), Field.FOCUSABLE);

        /* Construct the Close button */
        FieldChangeListener listener = new FieldChangeListener() {
            public void fieldChanged(Field field, int context) {
                ok();
            }
        };
        ButtonField b = new ButtonField("Close", Field.FIELD_HCENTER);
        b.setChangeListener(listener);

        /* Construct the text box containing the help */
        VerticalFieldManager vfm = new VerticalFieldManager(VERTICAL_SCROLL);
        TextField f;
        vfm.add(f = new TextField(FIELD_LEFT | READONLY));
        f.setText("My application does stuff. This part is the description of what it does.");
        vfm.add(f = new TextField(FIELD_LEFT | READONLY));
        vfm.add(f = new TextField(FIELD_LEFT | READONLY));
        f.setText("Commands:");
        vfm.add(f = new TextField(FIELD_LEFT | READONLY));
        f.setText("N - New Widget");
        vfm.add(f = new TextField(FIELD_LEFT | READONLY));
        f.setText("R - Rename Widget");
        vfm.add(f = new TextField(FIELD_LEFT | READONLY));
        f.setText("D - Duplicate Widget");
        vfm.add(f = new TextField(FIELD_LEFT | READONLY));
        f.setText("C - Clear Widget");
        vfm.add(f = new TextField(FIELD_LEFT | READONLY));
        f.setText("Shift-Delete - Delete Widget");

        /* Construct the screen */
        add(new LabelField("About Widget Wiffleball", Field.FIELD_HCENTER));
        add(new SeparatorField());
        add(vfm);
        add(b);
    }

    public void ok() {
        UiApplication.getUiApplication().popScreen(this);
    }
}

person MikeyB    schedule 25.06.2009    source источник


Ответы (1)


Для кода, который «не кажется правильным» - функционально он кажется прекрасным, но небольшой рефакторинг может немного его очистить - возможно, создать метод для создания и заполнения TextFields

private TextField createTextField(String content) {
    TextField textField = new TextField(
}

Затем эта часть конструктора становится:

VerticalFieldManager vfm = new VerticalFieldManager(VERTICAL_SCROLL);
vfm.add(createTextField("My application does stuff. This part is the description of what it does."));
vfm.add(createTextField("Commands:"));
vfm.add(createTextField("N - New Widget"));
vfm.add(createTextField("R - Rename Widget"));
vfm.add(createTextField("D - Duplicate Widget"));
vfm.add(createTextField("C - Clear Widget"));
vfm.add(createTextField("Shift-Delete - Delete Widget"));

Вы решаете проблему макета с помощью пользовательского менеджера полей - на самом деле это не сложно, вам просто нужно создать подкласс менеджера и реализовать подмакет. Определите «верхнее», «нижнее» и «среднее» поле и соответствующим образом расположите его (некоторый код опущен в качестве упражнения для читателя, но в основном при добавлении полей в менеджер вам нужно будет указать одно как вверху и одно внизу. Следующая логика гарантирует, что нижнее поле всегда прилипает к низу, а верхние 2 поля не отодвигают его от дна:

protected void sublayout(int width, int height) {
    // retrieve the top, middle and bottom fields

    int heightRemaining = height; 

    layoutChild(topField, width, heightRemaining);
    setPositionChild(topField, 0, 0);

    heightRemaining -= topField.getHeight();

    layoutChild(bottomField, width, heightRemaining);
    setPositionChild(bottomField, 0, height - bottomField.getHeight());

    heightRemaining -= bottomField.getHeight();

    layoutChild(middleField, width, heightRemaining);
    setPositionChild(middleField, 0, topField.getHeight());
}

Опять же, просто фреймворк — без проверки ошибок или чего-то еще. Затем установите своего делегата в качестве этого нового менеджера, установите менеджера вертикального поля в среднее поле (вам, вероятно, понадобится назначенный установщик), поле вашей кнопки в нижнее поле (опять же, назначенный получатель).

person Anthony Rizk    schedule 25.06.2009
comment
Спасибо - попробую. Я знаю, что некоторый рефакторинг поможет; при работе с новым фреймворком я склонен просто заставить его работать, а затем вернуться и сразу же провести рефакторинг. Неправильное ощущение возникает из-за того, что использование множества текстовых полей кажется немного хакерским. С другой стороны, возможно, это это правильный путь. - person MikeyB; 25.06.2009
comment
Использование статусной части MainScreen также было бы хорошим способом справиться с этим. Тогда вам не понадобится специальный менеджер. - person Michael Donohue; 14.02.2012