การใช้ NumberPicker Widget กับ Strings


98

มีวิธีใช้วิดเจ็ต Android NumberPicker เพื่อเลือกสตริงแทนจำนวนเต็มหรือไม่?

คำตอบ:


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

3
กุญแจสำคัญสำหรับฉันคือคุณต้องตั้งค่าที่แสดงและค่าต่ำสุดและสูงสุดก่อนที่จะทำงาน ขอบคุณ.
Ben Clayton

นี่ดีกว่าคำตอบที่เลือกไว้ข้างต้นมาก
Linh Lino

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];
  }
});

หวังว่าจะช่วย!


นี่เป็นคำตอบที่ดีที่สุด
samatron

ถ้าเป็นอาร์เรย์แสดงว่าไม่มี size () และ get () method ควรแทนที่ size () ด้วย. length และ get () แทนที่ด้วย arrayString [value]
RexSplode

หากคุณใช้ฟอร์แมตเตอร์แทนsetDisplayedValuesNumberPicker จะไม่วัดความกว้างอย่างถูกต้องดังนั้นข้อความของคุณอาจถูกตัดแม้ว่าจะใส่ได้พอดีก็ตาม
Matvey Rybakov

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 ดังนั้นคุณอาจต้องการแมปชื่อประเทศกับรหัสของพวกเขา

เพิ่ม: การใช้งาน NumberPicker มี:

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

ซึ่งดูเหมือนว่าจะทำงานได้ดีกว่าในสิ่งที่คุณต้องการจากนั้นฟอร์แมตเตอร์ด้านบน .. แม้ว่าจะไม่ได้ระบุไว้ในเอกสารดังนั้นอาจไม่ใช่ส่วนหนึ่งของ API สาธารณะ


ฉันต้องการใช้เพื่อเลือกเช่นประเทศ เช่นเดียวกับ Spinner Widget แต่ไม่ต้องเปิดเฟรมเพิ่มเติมที่ด้านล่างเพื่อเลือกค่า
timoschloesser

คำตอบที่อัปเดตแล้วอย่างไรก็ตามอาจมีวิธีที่ดีกว่าในการแสดงรายชื่อประเทศมากกว่าการพยายามแฮ็ก NumberPicker เพื่อทำสิ่งนี้
FunkTheMonk

@FunkTheMonk ฉันไม่พบsetRange()วิธีนี้ในเอกสารเลย! ความคิดใด ๆ ทำไม?
iTurki

ไม่มีเอกสารวิธีใดที่ไม่ได้เป็นส่วนหนึ่งของ API สาธารณะ - Google ไม่ได้รับการสนับสนุนอย่างเป็นทางการและอาจมีการเปลี่ยนแปลงในอนาคต - คุณต้องยอมรับความเสี่ยงเอง
FunkTheMonk

1
ในกรณีของฉันวิธีแก้ปัญหานี้มีข้อบกพร่องเล็กน้อยเมื่อแตะตัวเลือกใดตัวเลือกหนึ่งมันผิดพลาดหรือหายไปฉันไม่รู้ดีว่าทำไม คำตอบของแนนไม่มีปัญหานี้ ใครก็ได้บอกฉันทีว่าจะเกิดอะไรขึ้น? อย่างไรก็ตามฉันคิดว่าคำตอบของแนนดีกว่าและควรเป็นคำตอบที่ยอมรับได้ แต่บางทีฉันอาจจะขาดอะไรไป?
เอเคอร์

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.