NumberPicker不适用于键盘

Mag*_*eek 3 java android numberpicker

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" />
Run Code Online (Sandbox Code Playgroud)

MainActivity.java里面oncreate:

NumberPicker numberPicker1 = (NumberPicker) findViewById(R.id.numberPicker1);
numberPicker1.setMinValue(1);
numberPicker1.setMaxValue(20);
Run Code Online (Sandbox Code Playgroud)

当我用键盘编辑值时,我以编程方式获得的值不会改变,但如果我按下+然后-它可以工作.

如何在不按+和的情况下使其工作-


编辑:

我用MelihAltıntaş的代码创建了一个新项目,它显示了一个全新的数字选择器!(用手指滑动但不能输入文字的那个).然后我和我的真实项目相比,我看到了android:theme="@android:style/Theme.NoTitleBar".我在新项目中添加了它,然后numberpicker成为我习惯的那个.

1Ha*_*aKr 17

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

numberPicker.clearFocus();
Run Code Online (Sandbox Code Playgroud)


Luk*_*rog 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;
}
Run Code Online (Sandbox Code Playgroud)

然后你将使用这个代码TextWatcher在找到的EditText时候设置一个人工修改的时间(让我们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);
Run Code Online (Sandbox Code Playgroud)

另一种选择是制作您自己的NumberPicker小部件实现并插入您定位的功能.