将NumberPicker窗口小部件与字符串一起使用


94

有没有一种方法可以使用Android NumberPicker小部件选择字符串而不是整数?

Answers:


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

3
对我来说,关键是必须先设置displayValues以及最小值和最大值,然后才能起作用。谢谢。
本·克莱顿

这比上面选择的答案要好得多。
琳·里诺

2
但是,当我单击文本时,软键盘会弹出,我可以编辑文本。
混淆

14
@ArulxZ如果尚未弄清楚,只需调用picker.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);即可。以防止键盘弹出。
卡里姆·瓦雷拉

这对我有帮助!但是它出现的值为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 2015年

如果它是一个数组,则它没有size()和get()方法。size()应替换为.length,get()应替换为arrayString [value]
RexSplode

如果您使用formatter而不是setDisplayedValues,NumberPicker将无法正确测量其宽度,因此即使文本正确适合,文本也可能会被剪切。
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,因此您可能希望将国家/地区的名称映射到其ID。

添加:NumberPicker的实现具有:

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

这似乎比上面的格式化程序做得更好。.尽管在文档中没有提到,所以可能不是公共api的一部分


我想用它来选择一个国家。就像微调小部件一样,但无需在底部打开其他框架来选择值。
timoschloesser 2011年

更新了答案,但是列出国家/地区的方法可能比尝试破解NumberPicker进行此类操作更好。
FunkTheMonk 2011年

@FunkTheMonk我setRange()在文档中根本找不到此方法!有什么想法吗?
iTurki 2012年

没有文件记载的方法不是公共API的一部分-谷歌未正式支持它们,并且它们将来可能会更改-您自担风险。
FunkTheMonk 2012年

1
就我而言,此解决方案有一个小错误,当触摸其中一个选项时,它会出现故障或消失,我不知道为什么。楠的答案没有这个问题。有人可以告诉我会发生什么吗?无论如何,我认为Nan的答案更好,应该是公认的答案。但是也许我想念什么?
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","عربى"});
}
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.