4

activity_main.xml

<NumberPicker
        android:id="@+id/numberPicker1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView2"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp" />

MainActivity.java里面oncreate

NumberPicker numberPicker1 = (NumberPicker) findViewById(R.id.numberPicker1);
numberPicker1.setMinValue(1);
numberPicker1.setMaxValue(20);

当我用键盘编辑值时,我以编程方式获得的值不会改变,但如果我按下它+就会-起作用。

我怎样才能使它工作而不必按+and -


编辑 :

我用 Melih Altıntaş 的代码创建了一个新项目,它显示了一个全新的数字选择器!(您用手指滑动而无法输入文字的地方)。然后我与我的真实项目进行比较,我看到了android:theme="@android:style/Theme.NoTitleBar"。我在新项目中添加了它,然后数字选择器变成了我习惯的那个。

4

6 回答 6

20

如果有人想要一个简单的解决方法,只需在保存值之前添加以下代码。

numberPicker.clearFocus();
于 2014-03-21T13:29:45.907 回答
9

NumberPicker不是为这种交互而设计的。当您使用键盘更改值时,您是从 直接更改小部件,NumberPicker而小部件本身看不到此更改,因此这就是您最终得到最后存储值的原因。为了解决这个问题,您需要一些 hacky 代码,这并不是真正推荐的,因为您需要访问底层EditText(假设手机制造商一开始没有更改它):

private EditText findInput(ViewGroup np) {
    int count = np.getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = np.getChildAt(i);
        if (child instanceof ViewGroup) {
            findInput((ViewGroup) child);
        } else if (child instanceof EditText) {
            return (EditText) child;
        }
    }
    return null;
}

然后您将使用此代码TextWatcher在找到的内容上设置 aEditText以查看它何时被手动修改(并NumberPicker告知此更改):

EditText input = findInput(np);    
TextWatcher tw = new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {}

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {}

        @Override
        public void afterTextChanged(Editable s) {
                if (s.toString().length() != 0) {
                    Integer value = Integer.parseInt(s.toString());
                    if (value >= np.getMinValue()) {
                        np.setValue(value);
                    }
                }
        }
    };
input.addTextChangedListener(tw);

另一种选择是制作您自己的NumberPicker小部件实现并插入您的目标功能。

于 2013-09-24T17:00:06.303 回答
2

我看到您已经有了答案,但这可能对其他人有用。您可以扩展 android.widget.NumberPicker 并自己制作可以配置 EditText 的位置。当您在软键盘上键入时,NumberPicker 的值会立即设置为您正在键入的值。

public class MyNumberPicker extends android.widget.NumberPicker {

       private EditText eText;

       public MyNumberPicker(Context context, AttributeSet attrs) {
        super(context, attrs);
       }


       @Override
       public void addView(View child) {
         super.addView(child);
         initEditText(child);
       }

       @Override
       public void addView(View child, int index, android.view.ViewGroup.LayoutParams params) {
         super.addView(child, index, params);
         initEditText(child);
       }

       @Override
       public void addView(View child, android.view.ViewGroup.LayoutParams params) {
         super.addView(child, params);
         initEditText(child);
       }

       public void initEditText(View view){
           if(view instanceof EditText){
               EditText eText = (EditText) view;
               eText.addTextChangedListener(new TextWatcher(){

                @Override
                public void afterTextChanged(Editable arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                        int arg2, int arg3) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    try{
                        int num = Integer.parseInt(s.toString());
                        setValue(num); //this line changes the value of your numberpicker
                    }catch(NumberFormatException E){
                            //do your catching here
                    }   
                }});     
             }
          }
     }

在您的 XML 文件中,您输入以下内容:

<com.mypackage.MyNumberPicker
 android:id="@+id/numberPicker1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />
于 2014-04-02T09:25:18.550 回答
1

您必须按下Done按钮才能以编程方式更改值。

于 2013-09-22T14:43:46.400 回答
1
NumberPicker np = (NumberPicker) findViewById(R.id.numberPicker1);
String[] nums = new String[20];
for(int i=0; i<nums.length; i++)
       nums[i] = Integer.toString(i);

np.setMinValue(1);
np.setMaxValue(20);
np.setWrapSelectorWheel(false);
np.setDisplayedValues(nums);
np.setValue(1);
于 2013-09-22T14:54:20.620 回答
0

它不起作用的原因是,如果您查看 NumberPicker 中 setValue 的实现,它会调用另一个方法 setValueInternal(int, boolean),该方法采用 2 个参数作为新值,当然还有表示它是否应该的 bugger boolean通知 UI 是否有任何更改。猜猜看,在 setValue 中,布尔值始终为 false。该死的。但是还有一个技巧,我看到 validateInputTextView 实际上正确地执行了它,并且它在编辑文本没有焦点时调用。也许在正确的时间清除焦点会做应该做的事情。

于 2016-04-14T17:06:38.000 回答