Sử dụng tiện ích NumberPicker với chuỗi


94

Có cách nào để sử dụng tiện ích NumberPicker của Android để chọn chuỗi thay vì số nguyên không?

Câu trả lời:


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

3
Điều quan trọng đối với tôi là bạn phải đặt Giá trị hiển thị VÀ giá trị tối thiểu và tối đa trước khi nó hoạt động. Cảm ơn.
Ben Clayton

Điều này tốt hơn nhiều so với câu trả lời đã chọn ở trên.
Linh Lino

2
Nhưng khi tôi nhấp vào văn bản, bàn phím mềm sẽ bật ra và tôi có thể chỉnh sửa văn bản.
Nhầm lẫn

14
@ArulxZ Nếu bạn chưa tìm ra điều này, chỉ cần gọi picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); để ngăn bàn phím bật lên.
Karim Varela

Điều này đã giúp tôi! Nhưng nó xuất hiện giá trị 0 và tôi không thể loại bỏ nó .. Có ý kiến ​​gì không? Để giải thích trong bảng chọn của tôi xuất hiện 0, Bỉ, Pháp, Vương quốc Anh
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];
  }
});

hy vọng rằng sẽ giúp!


Đây là câu trả lời tốt nhất cho đến nay.
samatron

nếu nó là một mảng, thì nó không có các phương thức size () và get (). size () nên được thay thế bằng .length và get () được thay thế bằng arrayString [value]
RexSplode.

Nếu bạn sử dụng định dạng thay vì setDisplayedValues, NumberPicker sẽ không đo chiều rộng của nó một cách chính xác, vì vậy văn bản của bạn có thể bị cắt ngay cả khi nó có thể vừa khít.
Matvey Rybakov

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

Bạn có thể muốn nói điều gì đó khác, nhưng không rõ ý bạn là gì.

ĐÃ CẬP NHẬT:

Bạn có thể giả mạo nó bằng cách đặt định dạng của riêng bạn:

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 () sẽ vẫn trả về một int, vì vậy bạn có thể muốn ánh xạ tên các quốc gia vào id của họ.

THÊM: Việc triển khai NumberPicker có:

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

Cái nào dường như làm tốt hơn những gì bạn muốn thì trình định dạng trên .. mặc dù nó không được đề cập trong tài liệu nên có thể không phải là một phần của api công cộng


Tôi muốn sử dụng nó để chọn một quốc gia chẳng hạn. Giống như Spinner Widget, nhưng không cần mở thêm khung ở dưới cùng để chọn giá trị.
timoschloesser

Câu trả lời đã cập nhật, tuy nhiên, có lẽ có nhiều cách tốt hơn để liệt kê các quốc gia hơn là cố gắng hack NumberPicker để làm điều này.
FunkTheMonk

@FunkTheMonk Tôi không tìm thấy setRange()phương pháp này trong tài liệu! Bất kỳ ý tưởng tại sao?
iTurki

Không có phương pháp nào được ghi lại không phải là một phần của API công khai - chúng không được google hỗ trợ chính thức và chúng có thể sẽ thay đổi trong tương lai - bạn tự chịu rủi ro khi sử dụng.
FunkTheMonk

1
Trong trường hợp của tôi, giải pháp này có một lỗi nhỏ, khi chạm vào một trong các tùy chọn, nó bị trục trặc hoặc biến mất, tôi không biết rõ tại sao. câu trả lời của nan không có vấn đề này. Bất cứ ai có thể cho tôi biết điều gì có thể xảy ra? Dù sao, tôi nghĩ câu trả lời của nan là tốt hơn và nên là câu trả lời được chấp nhận. Nhưng có lẽ tôi đang thiếu một cái gì đó?
acrespo

8

hãy thử giải pháp này, có thể giúp bạn

    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

Điều này đã làm việc cho tôi.

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","عربى"});
}
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.