1

AutoCompleteFieldBlackberryアプリの画面の1つにtpを配置しました。ユーザーが情報を入力するためのヒントを提供するために、プレースホルダーテキストを表示する必要があります。

これが以下のコードですAutoCompleteField

BasicFilteredList filterList = new BasicFilteredList();
        String[] address = { "T 115 Centro Galleria Shopping Centre, Cnr Old Collier and Walters Road Morley WA 1522", 
                "1423 SEAVIEW POINT POINT COOK VIC 2674",
                "Lot 1498 Yarraman Road Wyndham Vale VIC 3795", 
                "Lot 3506 Witchmount Close Hillside VIC 4055",
                "6 Paas Place Williamstown VIC 4233", 
                "Lot 99 14 James Close Sunbury VIC 4502", 
                "1 Charlotte Street Clayton South VIC 4779" };

        filterList.addDataSet(1, address, "address", BasicFilteredList.COMPARISON_IGNORE_CASE);
        AutoCompleteField autoCompleteField = new AutoCompleteField(filterList){
            public void onSelect(Object selection, int SELECT_TRACKWHEEL_CLICK) {
                 ListField _list = getListField();
                 if (_list.getSelectedIndex() > -1) {
                     if(selectedText!=null){
                         BasicFilteredListResult result = (BasicFilteredListResult) selection;
                         selectedText.setText(result._object.toString());
                     }
                 }
             }
        };
        add(autoCompleteField);

どなたか、どうすれば同じように実装できるか教えてください。

ありがとう。

4

1 に答える 1

2

ここに示されている通常のEditFieldsと同様の手法を使用できます。基本的に、サブクラスのpaint()メソッドをオーバーライドする必要があります。AutoCompleteFieldではpaint()、フィールドが空であるかどうかを確認し、空である場合は、必要なプレースホルダーテキストを手動で描画します。

違いは、内部にあるということですAutoCompleteField。したがって、テキストを適切に描画するには、親( )内の編集フィールドのxオフセットとyオフセットを把握する必要があります。ManagerBasicEditFieldManagerAutoCompleteField

したがって、AutoCompleteFieldインスタンスを次のクラスのインスタンスに置き換えます。

   private class CustomAutoCompleteField extends AutoCompleteField {
      private int yOffset = 0;
      private int xOffset = 0;

      public CustomAutoCompleteField(BasicFilteredList filteredList) {
         super(filteredList);
      }

      protected void paint(Graphics g) {
         super.paint(g);
         if (xOffset == 0) {
            // initialize text offsets once
            xOffset = getEditField().getContentLeft();
            yOffset = getEditField().getContentTop();
         }
         String text = getEditField().getText();
         if (text == null || text.length() == 0) {
            int oldColor = g.getColor();
            g.setColor(Color.GRAY);
            g.drawText("enter text", xOffset, yOffset);
            g.setColor(oldColor);
         }
      }

      public void onSelect(Object selection, int SELECT_TRACKWHEEL_CLICK) {
         ListField _list = getListField();
         if (_list.getSelectedIndex() > -1) {
            if(selectedText!=null){
               BasicFilteredListResult result = (BasicFilteredListResult) selection;
               selectedText.setText(result._object.toString());
            }
         }
      }
   }

これをOS5.0でテストしましたが、マージンやパディングが設定されていないインスタンスを使用しました。レイアウトが異なると、xオフセットとyオフセットを計算するためのロジックを調整する必要がある場合があります。しかし、上記のコードは基本的な考え方を示しています。幸運を。

編集:onSelect()上記のコードは、メソッドが表示されていないコードに明らかに依存しているという警告とともに表示されます。現状では、上記のコードはコンパイルされません。プレースホルダーテキストの問題に直接関係していないため、onSelect()基本的に元の匿名クラスを置き換えているだけであり、メソッドで何も変更していないことを示すためにそこに残しました。onSelect()

于 2012-06-03T03:01:07.890 に答える