文字列でのNumberPickerウィジェットの使用


94

整数の代わりに文字列を選択するためにAndroid NumberPickerウィジェットを使用する方法はありますか?

回答:


239
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );

3
私にとっての鍵は、それが機能する前に、displayedValuesと最小値と最大値を設定する必要があることでした。ありがとう。
Ben Clayton

これは、上記で選択した回答よりもはるかに優れています。
Linh Lino 2014

2
しかし、テキストをクリックすると、ソフトキーボードが表示され、テキストを編集できます。
混乱させる

14
@ArulxZこれをまだ理解していない場合は、picker.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);を呼び出してください。キーボードがポップアップするのを防ぐため。
Karim Varela

これは私を助けました!しかし、値0が表示され、削除できません。私のピッカーで説明するには、0、ベルギー、フランス、イギリスが表示されます
user4292106

38
NumberPicker numberPicker = new NumberPicker(this);
String[] arrayString= new String[]{"hakuna","matata","timon","and","pumba"};
numberPicker.setMinValue(0);
numberPicker.setMaxValue(arrayString.length-1);

numberPicker.setFormatter(new NumberPicker.Formatter() {
  @Override
  public String format(int value) {
    // TODO Auto-generated method stub
    return arrayString[value];
  }
});

お役に立てば幸いです。


これは断然最良の答えです。
サマトロン

配列の場合、size()メソッドとget()メソッドはありません。size()は.lengthで置き換え、get()はarrayString [value]で置き換えます
RexSplode

の代わりにフォーマッターを使用する場合setDisplayedValues、NumberPickerはその幅を適切に測定しないため、テキストが適切に収まる場合でもテキストがクリップされる可能性があります。
Matvey Rybakov 2017

15
String value = String.valueOf(picker.getValue());

他のことを意味する可能性がありますが、意味が明確ではありません。

更新しました:

独自のフォーマッターを設定することで、それを偽造することができます:

CountryFormatter implements Formatter {
    public String toString(int value) {
        switch(value) {
            case 0:
                return "England";
            case 1:
                return "France";
        }
        return "Unknown";
    }
}

picker.setFormatter(new CountryFormatter());

getValue()は引き続きintを返すため、おそらく国の名前をそのIDにマップする必要があります。

追加:NumberPickerの実装には以下が含まれます。

public void setRange(int start, int end, String[] displayedValues)

上記のフォーマッタよりも、あなたが望むもののより良い仕事をしているようです..それはドキュメントには記載されていないので、おそらくパブリックAPIの一部ではありません


例えば国を選ぶのに使いたいです。スピナーウィジェットと同じですが、値を選択するために下部に追加のフレームを開く必要はありません。
timoschloesser

回答を更新しましたが、このようなことをするためにNumberPickerをハックするよりも、国をリストする方法がおそらくあります。
FunkTheMonk

@FunkTheMonk私setRange()はドキュメントでこのメソッドを見つけることができませんでした!何かアイデアはありますか?
iTurki

文書化されたメソッドはどれもパブリックAPIの一部ではありません-それらはGoogleによって正式にサポートされておらず、おそらく将来変更される可能性があります-自己責任で使用してください。
FunkTheMonk

1
私の場合、この解決策には小さなバグがあり、オプションの1つに触れると、不具合が発生するか、消えてしまいました。理由はよくわかりません。ナンの答えにはこの問題はありませんでした。誰が何が起こっているのか教えてもらえますか?とにかく、私はナンの答えがより良く、受け入れられた答えであるべきだと思います。しかし、おそらく何か不足していますか?
acrespo 2013

8

この解決策を試してください、あなたを助けるかもしれません

    NumberPicker pickers = new NumberPicker(this);
    String[] arrayPicker= new String[]{"abc","def","ghi","jkl","mno"};

    //set min value zero
    pickers.setMinValue(0);
    //set max value from length array string reduced 1
    pickers.setMaxValue(arrayPicker.length - 1);
    //implement array string to number picker
    pickers.setDisplayedValues(arrayPicker);
    //disable soft keyboard
    pickers.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
    //set wrap true or false, try it you will know the difference
    pickers.setWrapSelectorWheel(false);

    //create button to test selected text string
    btnPicker.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //get position (int) from number picker
            int pos = pickers.getValue();
            //get string from number picker and position
            String selecPicker = arrayPicker[pos];  
            //test toast to get selected text string
            Toast.makeText(context, selecPicker , Toast.LENGTH_SHORT).show();

        }
    });

0

これでうまくいきました。

public class YourClassName extends AppCompatActivity {

NumberPicker picker = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout_file);

    picker = (NumberPicker) findViewById(R.id.pickerId_From_your_Layout_file);

     picker.setMinValue(0);
    picker.setMaxValue(3);
    picker.setDisplayedValues(new String[]{"English", "French","Kiswahili","عربى"});
}
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.