Menggunakan Widget NumberPicker dengan Strings

95

Apakah ada cara menggunakan widget Android NumberPicker untuk memilih string, bukan bilangan bulat?

timoschloesser
sumber

Jawaban:

241
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );
nan
sumber
3
Kuncinya bagi saya di sana adalah Anda harus mengatur displayValues ​​DAN min dan max sebelum berfungsi. Terima kasih.
Ben Clayton
Ini jauh lebih baik daripada jawaban yang dipilih di atas.
Linh Lino
2
Tetapi ketika saya mengklik teks, keyboard lembut akan keluar dan saya dapat mengedit teks.
Bingung
14
@ArulxZ Jika Anda belum menemukan jawabannya, panggil picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); untuk mencegah keyboard muncul.
Karim Varela
Ini membantu saya! Tapi ternyata nilai 0 dan saya tidak bisa menghapusnya .. Ada ide? Untuk menjelaskan di alat pilih saya muncul 0, Belgia, Prancis, Inggris Raya
pengguna4292106
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];
  }
});

semoga membantu!

harshitpthk.dll
sumber
Sejauh ini, ini adalah jawaban terbaik.
samatron
jika itu adalah sebuah array, maka itu tidak memiliki metode size () dan get (). size () harus diganti dengan .length, dan get () diganti dengan arrayString [value]
RexSplode
Jika Anda menggunakan pemformat, bukan setDisplayedValues, NumberPicker tidak akan mengukur lebarnya dengan benar, jadi teks Anda mungkin terpotong bahkan jika pas.
Matvey Rybakov
15
String value = String.valueOf(picker.getValue());

Anda bisa berarti sesuatu yang lain, tetapi tidak terlalu jelas apa yang Anda maksud.

DIPERBARUI:

Anda dapat memalsukannya dengan mengatur formatter Anda sendiri:

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 () akan tetap mengembalikan int, jadi Anda mungkin ingin memetakan nama negara ke id mereka.

DITAMBAHKAN: Implementasi NumberPicker memiliki:

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

Yang tampaknya melakukan pekerjaan yang lebih baik dari apa yang Anda inginkan daripada pemformat di atas .. meskipun tidak disebutkan dalam dokumentasi jadi mungkin bukan bagian dari api publik

FunkTheMonk
sumber
Saya ingin menggunakannya untuk memilih, misalnya, sebuah negara. Sama seperti Spinner Widget, tetapi tanpa membuka bingkai tambahan di bagian bawah untuk memilih nilai.
timoschloesser
Jawaban yang diperbarui, namun mungkin ada cara yang lebih baik untuk membuat daftar negara daripada mencoba meretas NumberPicker untuk melakukan hal semacam ini.
FunkTheMonk
@FunkTheMonk Saya tidak dapat menemukan setRange()metode ini di dokumen sama sekali! Ada ide mengapa?
iTurki
Tidak ada metode terdokumentasi yang bukan bagian dari API publik - metode tersebut tidak secara resmi didukung oleh Google dan mungkin akan berubah di masa mendatang - Anda gunakan dengan risiko Anda sendiri.
FunkTheMonk
1
Dalam kasus saya, solusi ini memiliki bug kecil, ketika menyentuh salah satu opsi, itu bermasalah atau menghilang, saya tidak tahu persis mengapa. Jawaban nan tidak memiliki masalah ini. Ada yang bisa memberi tahu saya apa yang mungkin terjadi? Bagaimanapun, saya pikir jawaban nan lebih baik dan harus menjadi jawaban yang diterima. Tapi mungkin saya melewatkan sesuatu?
acrespo
8

coba solusi ini, semoga membantu anda

    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();

        }
    });
Irvan Dwi Pangga
sumber
0

Ini berhasil untuk saya.

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","عربى"});
}
}
NelsonRoberts
sumber