Как предотвратить прокрутку в одном направлении в HorizontalFieldManager?

#blackberry

#ежевика

Вопрос:

У меня есть требование к однострочному полю редактирования, которое может принимать текст длиной больше ширины поля редактирования (например, «обычное» текстовое поле Windows).

Поскольку элемент управления BasicEditField обычно переносит свое содержимое в word, я реализовал это требование, поместив мое BasicEditField внутри HorizontalFieldManager, который разрешает горизонтальную прокрутку.

Это работает в одном смысле: если я набираю текст длиннее ширины поля редактирования, HFM автоматически прокручивается влево (забирая с собой поле редактирования), что позволяет курсору оставаться видимым справа.

Проблема в том, что пользователь может провести пальцем справа налево, что полностью перемещает BasicEditField с экрана влево. Я хочу иметь возможность прокручивать влево только тогда, когда содержимое BasicEditField слишком велико, чтобы отображаться полностью, и разрешать прокрутку влево только настолько, чтобы курсор оставался видимым справа.

Ответ №1:

Я боролся с этим точным сценарием при реализации моего собственного EditField. Происходит то, что, поскольку вы разрешаете горизонтальную прокрутку, а поле редактирования по своей природе хочет использовать как можно большую ширину, в итоге получается очень широкое поле редактирования. Я копирую это из своего кода, так что, надеюсь, у вас это сработает, но если это не поможет, добавьте комментарий, и я постараюсь посмотреть, смогу ли я помочь заставить это работать.

 EditField edit = new EditField(EditField.NO_NEWLINE | style) {

        protected void fieldChangeNotify(int context) {
            try{
                super.fieldChangeNotify(context);
                setExtent(this.getFont().getAdvance(this.getText())   10, this.getHeight());
            }
            catch(Exception e){
                //don't recall why I needed this, but it works so I'm hesitant to remove it
            }

        }
        protected void layout(int width, int height) {
            super.layout(width, height);
            setExtent(this.getFont().getAdvance(this.getText())   10, this.getHeight());
        }
    };
  

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

Комментарии:

1. Спасибо. С момента публикации этого вопроса я пошел в немного другом направлении. Сейчас я подключаюсь к событию ScrollChanged HFM, измеряю ширину текста в окне редактирования и использую setHorizontalScroll , чтобы ограничить прокрутку ровно настолько, чтобы курсор отображался справа. Мне все еще нужно отслеживать, когда пользователь перемещает курсор влево, поскольку в данный момент он исчезает.

2. Кстати, этот код, кажется, идеально подходит для размещения курсора, который обычно имеет ширину пробела: this.getFont().getAdvance(this.getText() " ") .