Как динамически создать несколько полей в Blackberry Java SDK 5.0?

Я пытаюсь создать пару объектов BasicEditField после того, как получу количество полей, которые мне нужны, из ObjectChoiceField.

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

Что я хочу сделать :

  1. выберите номер BasicEditFields, который я хочу.
  2. обновите экран, чтобы появились добавленные поля.

ПД: если вам нужна дополнительная информация, просто скажите мне, и извините за мой английский. Я новичок в разработке для платформы BlackBerry.

public final class MyScreen extends MainScreen
{
    private int fields_lenght;

    public MyScreen()
    {        
        // Set the displayed title of the screen       
        setTitle("Example");
        fields_lenght =0;

        final String shortcodes[] = {"1","2","3"};
        final ObjectChoiceField dropdownlist=new ObjectChoiceField("Select a number of fields",shortcodes);
        this.add(dropdownlist);

        dropdownlist.setChangeListener( new FieldChangeListener() {

            public void fieldChanged( Field arg0, int arg1 ) {
                    if(arg1 != PROGRAMMATIC){
                        fields_lenght= Integer.parseInt(shortcodes[dropdownlist.getSelectedIndex()]);
                    }
            }
        } );

        // how to refresh the screen with the new fields ???

            BasicEditField fields[]=new BasicEditField [fields_lenght] ;

            for(int i = 0; i<fields.length;i++){
                fields[i]=new BasicEditField("Campo "+i,"");
                this.add(fields[i]);
            }

     }

}

comment
Можете ли вы показать нам код, в котором вы добавляете свои новые поля BasicEditField? (просто щелкните ссылку редактировать под вопросом и добавьте код в свой вопрос) Кроме того, есть ли причина, по которой вы не хотите делать это в прослушивателе ObjectChoiceField ?   -  person Nate    schedule 12.11.2013
comment
@Nate Привет, Нейт, теперь ты можешь увидеть пример того, что я хочу сделать.   -  person AmirG    schedule 12.11.2013
comment
@Nate Я не хотел использовать его в прослушивателе ObjectChoiceField, потому что он добавляет больше полей, чем мне нужно, поскольку прослушиватель воспринимает щелчок и движение колесика как одно и то же действие, я пытался переопределить щелчок и движение колесика, но это не сработало. Также я хотел бы удалить поля, например, если выбор изменится на 2 из 3, что означает, что мне придется удалить одно поле. Надеюсь, я объяснил себя. я читал о методе Invalidate() с экрана, но я действительно не понимаю, как его реализовать.   -  person AmirG    schedule 12.11.2013


Ответы (1)


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

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

public final class MyScreen extends MainScreen {

   /** A cached vector of the BasicEditFields, to make deleting easier */
   private Vector fields;

   public MyScreen() {
      super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);

      setTitle("Example");

      final String shortcodes[] = {"1","2","3"};
      final ObjectChoiceField dropdownlist = new ObjectChoiceField("Select a number of fields", shortcodes);
      add(dropdownlist);

      fields = new Vector();
      final Screen screen = this;

      dropdownlist.setChangeListener( new FieldChangeListener() {

         public void fieldChanged( Field field, int context ) {
            if (context != PROGRAMMATIC) {
               // how many fields has the user chosen?
               int fieldsLength = Integer.parseInt(shortcodes[dropdownlist.getSelectedIndex()]);

               while (fieldsLength > fields.size()) {
                  // we need to ADD more fields
                  Field f = new BasicEditField("Campo " + fields.size(), "");
                  fields.addElement(f);
                  screen.add(f);
               }

               while (fieldsLength < fields.size()) {
                  // we need to DELETE some fields
                  Field f = (Field)fields.elementAt(fields.size() - 1);
                  fields.removeElement(f);
                  screen.delete(f);
               }                                         
            }
         }
      });
   }

Я определил нового члена с именем fields, который просто упрощает отслеживание основных полей редактирования (на случай, если на этом экране есть много других полей).

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

Примечание. Здесь нет необходимости вызывать invalidate(). Вызов Screen#add() или Screen#delete() должен добавить/удалить поля и вызвать перерисовку.

person Nate    schedule 12.11.2013
comment
вау, спасибо, Нейт, я не знаю, что я делал, что внутри слушателя он понимает движение колесика как щелчок колесика, поэтому даже когда он просто перемещался по списку, он что-то выбирал. В любом случае, код, который вы мне дали, работал нормально, спасибо, братан, хорошего дня! - person AmirG; 12.11.2013