17

对所有人来说,

我试图让一个简单的 NumberPicker 在 AlertDialog 中工作。问题是每当我增加/减少数字选择器中的值时,键盘都会激活。

有很多帖子描述了这个问题,但没有一个建议有效。我试过了:

android:configChanges="keyboard|keyboardHidden"

inputManager.hideSoftInputFromWindow(currentView.getWindowToken(), 0);

getWindow().setSoftInputMode(
     WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

我曾尝试在初始化(dialog.show())之前和之后调用这些函数,在按键事件(显然使用侦听器)等上,但到目前为止没有运气。

完整代码:

弹出.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >
    <NumberPicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/myNumber"
        android:configChanges="keyboard|keyboardHidden"   
    />
</RelativeLayout>

和调用函数:

AlertDialog.Builder builder =  new AlertDialog.Builder(this);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        return;
    } }); 
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        return;
    } }); 
View view = getLayoutInflater().inflate(R.layout.popup, null);
builder.setView (view);

final AlertDialog dialog = builder.create ();
NumberPicker picker = (NumberPicker) view.findViewById(R.id.myNumber);
picker.setMinValue(0);
picker.setMaxValue(999);

dialog.getWindow().
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
dialog.show();      

任何帮助表示赞赏

巴里

4

4 回答 4

25

实际上,虽然上面的解决方案非常有效,但还有一种更简单的方法。

picker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

这就是所有需要的。无论如何,谢谢你的回复!!!!:-)

于 2012-06-12T17:56:16.983 回答
3

由于无法访问 NumberPicker 按钮,因此“不可能”这样做。

我做了快速肮脏的黑客来处理它。

首先将焦点食者添加到布局中,在本例中为 0 大小的 Button:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >
    <NumberPicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/myNumber"
        android:configChanges="keyboard|keyboardHidden"
        />
    <Button
        android:id="@+id/myBtn"
        android:layout_width="0dp"
        android:layout_height="0dp"
        />
</RelativeLayout>

我们需要捕捉点击递增/递减按钮的事件,我选择了 OnValueChangedListener,找不到更好的东西。

    EditText edit = null;
    try {
        final Field[] fields = picker.getClass().getDeclaredFields();
        for (Field f : fields) {
            if (EditText.class.equals(f.getType())) {
                f.setAccessible(true);
                edit = (EditText) f.get(picker);
            }
        }
    } catch (IllegalAccessException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
    if (edit != null) {
        final EditText finalEdit = edit;
        final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
            @Override
            public void onValueChange(NumberPicker numberPicker, int i, int i1) {
                dialog.findViewById(R.id.myBtn).requestFocusFromTouch();
                imm.hideSoftInputFromWindow(finalEdit.getWindowToken(), 0);
            }
        });
    }

这不是推荐的解决方案。我希望有人会找到更好的东西。仅用于教育目的;-)

于 2012-06-12T14:50:13.313 回答
1

android:configChanges属性属于您的Manifest.xml文件,而不是布局。但是如果你从那里隐藏键盘,你可能最好使用

android:windowSoftInputMode="stateAlwaysHidden"

您还应该尝试getWindow()在您的Activity而不是仅在上使用Dialog,看看是否有帮助。这可能是最好的解决方案,因为第一个(从清单中隐藏)将使键盘在整个活动中保持隐藏。

于 2012-06-12T13:00:16.197 回答
0

XML:

<NumberPicker
    ...
    android:descendantFocusability="blocksDescendants" />
于 2015-08-07T14:42:19.010 回答