Добавление полей до полного заполнения экрана - PullRequest
0 голосов
/ 25 февраля 2010

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

Кажется, я должен быть в состоянии сделать что-то вроде:

HorizontalFieldManager hfm = new HorizontalFieldManager();

int remainingWidth = Display.getWidth();

int i =0;
while(true) {
    ButtonField bf = new ButtonField("B " + i);
    remainingWidth -= bf.getWidth();
    if(remainingWidth<0)
        break;
    hfm.add(bf);
    i++;
}

add(hfm);

Но это не работает. bf.getWidth () всегда равно 0. Я подозреваю, что это потому, что кнопка еще не была выложена, когда я запрашиваю ширину.

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

  1. Разные платформы BB по-разному выглядят для кнопок, и текст, который будет помещаться на кнопке на кривой, не помещается на кнопке в шторме.
  2. Темы сторонних производителей могут изменить внешний вид кнопок, поэтому я даже не могу рассчитывать на кнопки определенного размера на определенной платформе.

Нет ли способа проверить оставшееся место перед добавлением кнопки? Это похоже на довольно полезную функцию; я что-то упускаю?

Ответы [ 3 ]

1 голос
/ 25 февраля 2010

Вы правы, что getWidth() возвращает ширину поля после того, как было выложено (поэтому 0), но getPreferredWidth() вернет значение, данное Менеджеру макетов, и, вероятно, то, что вы хотите.

Другая проблема, с которой вы столкнулись, состоит в том, что вы сравниваете remainingWidth с 0. Если предпочтительная ширина кнопки, скажем, 36 пикселей, а оставшаяся ширина 20 пикселей, вы нарисуете кнопку в месте, где у вас недостаточно места для его отображения.

Попробуйте что-то вроде этого:

HorizontalFieldManager hfm = new HorizontalFieldManager();
int remainingWidth = Display.getWidth();
for (int i; true; i++ ) {
  ButtonField bf = new ButtonField("B " + i);
  int preferredWidth = bf.getPreferredWidth();
  if ( remainingWidth < preferredWidth )
    break;
  remainingWidth -= preferredWidth;
  hfm.add(bf);
}
add(hfm);
1 голос
/ 25 февраля 2010

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

Вам, вероятно, следует добавить также отступ, если он есть у кнопки.

public class Main extends UiApplication{

    public static void main(String[] args) {
        Main main = new Main();
        main.enterEventDispatcher();
    }

    public Main() {
        Screen main = new Screen();
        this.pushScreen(main);
        main.init();
    }
}

public class Screen extends MainScreen    {
HorizontalFieldManager hfm;
public Screen() {
    hfm = new HorizontalFieldManager();
    this.add(hfm);
}

public void init() {
    int remainingWidth = Display.getWidth();
    int i = 0;
    while(true) {
        ButtonField bf = new ButtonField("B " + i);
        hfm.add(bf);
        remainingWidth -= bf.getWidth();
        System.out.println(remainingWidth);
        if(remainingWidth <= 0) {
            hfm.delete(bf);
            break;
        }
        i++;
    }
}
0 голосов
/ 17 марта 2010

Попробуйте сделать свой собственный HorizontalFiledManager (менеджер расширений) и переопределить

<code>
 protected void sublayout( int maxWidth, int maxHeight ){</p>

<p>setExtent(maxWidth,maxHeight);
}
Получите количество дочерних элементов, и с помощью цикла for просмотрите и начните раскладывать дочерние элементы (setPosition, layoutChild). Когда вы размещаете дочерний элемент, подсчитайте его ширину и всегда проверяйте, будет ли подсчитанная ширина + ширина следующего дочернего элемента больше, чем maxWidth, затем не раскладывайте и не прерывайте цикл for. Надеюсь, это поможет вам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...