AlertDialog中的NumberPicker总是激活键盘。 如何禁用这个?

对于所有,

我正在试图让一个简单的NumberPicker在AlertDialog中工作。 问题是,无论何时我增加/减lessnumberpicker的值,键盘激活。

有很多职位描述这个问题,但没有任何build议工作。 我努力了:

android:configChanges="keyboard|keyboardHidden" 

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

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

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

完整的代码:

popup.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(); 

任何帮助赞赏

巴里

Related of "AlertDialog中的NumberPicker总是激活键盘。 如何禁用这个?"

其实,上面的解决scheme虽然完美,但有一个更简单的方法。

 picker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 

这是所有需要的。 无论如何,谢谢你的答复! 🙂

由于没有访问NumberPickerbutton,这是“不可能的”。

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

首先添加焦点到布局,在这种情况下button与0大小:

 <?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> 

我们需要捕捉点击inces / decrementbutton的事件,我select了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); } }); } 

这不是build议的解决scheme。 我希望有人能find更好的东西。 仅用于教育目的;-)

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

 android:windowSoftInputMode="stateAlwaysHidden" 

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

XML:

 <NumberPicker ... android:descendantFocusability="blocksDescendants" />