【问题标题】:Using NumberPicker Widget with Strings将 NumberPicker 小部件与字符串一起使用
【发布时间】:2012-01-03 20:28:00
【问题描述】:

有没有办法使用 Android NumberPicker 小部件来选择字符串而不是整数?

【问题讨论】:

    标签: android


    【解决方案1】:
    NumberPicker picker = new NumberPicker(this);
    picker.setMinValue(0);
    picker.setMaxValue(2);
    picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );
    

    【讨论】:

    • 对我来说关键是你必须在它工作之前设置显示的值和最小值和最大值。谢谢。
    • 这比上面选择的答案要好得多。
    • 但是当我点击文本时,软键盘会弹出,我可以编辑文本。
    • @ArulxZ 如果您还没有弄清楚这一点,只需调用 picker.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);以防止键盘弹出。
    • 这对我有帮助!但它的值似乎为 0,我无法删除它.. 知道吗?解释在我的选择器中出现 0, Belgium, France, United Kingdom
    【解决方案2】:
    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]
    • 如果您使用格式化程序而不是setDisplayedValues,NumberPicker 将无法正确测量其宽度,因此即使您的文本可以正确放置,也可能会被剪裁。
    【解决方案3】:
    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 的一部分

    【讨论】:

    • 我想用它来选择例如一个国家。就像 Spinner Widget 一样,但没有在底部打开一个额外的框架来选择一个值。
    • 更新了答案,但是列出国家/地区的方法可能比尝试破解 NumberPicker 来做这种事情更好。
    • @FunkTheMonk 我在文档中根本找不到这个setRange() 方法!任何想法为什么?
    • 没有记录的方法不是公共 API 的一部分 - 它们不受 google 官方支持,将来可能会发生变化 - 使用风险自负。
    • 就我而言,这个解决方案有一个小错误,当触摸其中一个选项时,它会出现故障或消失,我不太清楚为什么。 nan的回答没有这个问题。谁能告诉我会发生什么?无论如何,我认为南的答案更好,应该是公认的答案。但也许我错过了什么?
    【解决方案4】:

    试试这个解决方案,可能对你有帮助

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

    【讨论】:

      【解决方案5】:

      这对我有用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        相关资源
        最近更新 更多