0

から必要なフィールドのBasicEditFieldを取得した後、いくつかのオブジェクトを作成しようとしています。ObjectChoiceField

問題:BasicEditField画面に追加したフィールドは、リスナーで実行しない限り更新されませんObjectChoiceField

私がしたいこと :

  1. 必要な数を選択しますBasicEditFields
  2. 追加されたフィールドが表示されるように画面を更新します。

PD: さらに情報が必要な場合は、教えてください。私の英語について申し訳ありません。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]);
            }

     }

}
4

1 に答える 1

2

リスナー内からフィールドを追加または削除する必要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ベクターに追加します。数を減らしたい場合は、Vector の末尾からいくつかのフィールドを削除し、それらを画面から削除します。

注: ここに電話する必要はありませんinvalidate()Screen#add()orを呼び出すScreen#delete()と、フィールドが追加/削除され、再描画が発生します。

于 2013-11-12T07:36:40.180 に答える