Blackberry - Обновление экрана изменяет порядок рисования менеджера его элементов поля - PullRequest
0 голосов
/ 22 июня 2009

Сценарий
На экране у меня есть 2 менеджера: 1) менеджер меню вверху и 2) менеджер тела, который имеет элементы info / button. Менеджер меню выполняет пользовательское рисование, чтобы его элементы меню (LabelFields) были правильно расположены.

Основная проблема - порядок рисования менеджера и подполя
Экран хорошо рисует, за исключением случаев, когда пользователь выполняет действие (нажимает кнопку), в результате которого добавляется / удаляется элемент без менеджера тела. Как только элементы поля добавлены / удалены из тела, порядок, в котором отображается меню, смешивается.

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

Комментарии
Уже пробовал аннулировать и другие опции - я пытался вызвать invalidate, invalidateall, updateDisplay ... после добавления / удаления элементов поля из тела. Все без успеха.

Удаление пользовательского подслоя работает. Единственный способ решить эту проблему - удалить логику пользовательского подуровня менеджеров меню. К сожалению, система меню тогда рисует традиционным способом и не обеспечивает достаточного расстояния.

Ниже приведен код подслоя менеджера меню, я что-то здесь упускаю?

public void sublayout(int iWidth, int iHeight)
{
    final int iNumFields = getFieldCount();
    int maxHeight = 0;


    final int segmentWidth = iWidth / iNumFields;
    final int segmentWidthHalf = segmentWidth / 2;

    for (int i = 0; i < iNumFields; i++)
    {
        final Item currentField = (Item)this.getField(i);

        // 1. Use index to compute bounds of the field
        final int xSegmentTrueCenter = segmentWidth * i + segmentWidthHalf;

        // 2. center field inbetween bounds using field width (find fill width of text)
        final int xFieldStart = xSegmentTrueCenter - currentField.getFont().getAdvance(currentField.getText())/2;

        // set up position
        setPositionChild(currentField, xFieldStart, getContentTop() + MenuAbstract.PADDING_VERTICAL);

        // allow child to draw itself
        layoutChild(currentField, iWidth, currentField.getHeight());


        // compute max height of the field
        //int fieldheight = currentField.getHeight();
        maxHeight = currentField.getHeight() > maxHeight
            ? currentField.getHeight() + 2 * MenuAbstract.PADDING_VERTICAL
            : maxHeight;
    }
    this.setExtent(iWidth, maxHeight);
}

Заключительные вопросы
В конечном итоге я хочу сохранить пользовательский макет менеджера меню, в то же время позволяя перерисовывать элементы поля. Вот мои последние вопросы:

  1. Вы уже испытывали это раньше?

  2. Почему менеджер меню начинает рисовать в неправильном порядке, когда элемент поля добавляется / удаляется на экран?

  3. Делает ли native Manager.sublayout () что-то, что я не поддерживаю в порядке рисования?

1 Ответ

1 голос
/ 24 июня 2009

Я не видел описанного вами поведения, но следующая строка немного беспокоит:

// allow child to draw itself
layoutChild(currentField, iWidth, currentField.getHeight());

getHeight () не должна возвращать разумное значение, пока поле не вызовет setExtent через метод layoutChild. Хотя я ожидаю, что это вызовет проблемы во всех случаях - не уверен, почему это сработает с первого раза. В вашей логике я думаю, что вы можете безопасно использовать iHeight вместо currentField.getHeight () в этой строке. Поле станет настолько большим, насколько это необходимо - оно не будет использовать весь iHeight, если оно не похоже на VerticalFieldManager

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...