我正在尝试在使用NumberPicker输入数值时停用软键盘(出于美观原因)。这是我的layout-xml-code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="30dp"
android:layout_marginTop="30dp" >
<NumberPicker
android:id="@+id/repetitionPicker"
android:layout_width="40dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/repetitions_short_divider"
android:textAppearance="?android:attr/textAppearanceMedium" />
<NumberPicker
android:id="@+id/weightPicker"
android:layout_width="40dp"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/pounds"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
<Button
android:id="@+id/saveButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/save" />
</LinearLayout>
最后这是我尝试在onCreate()方法中阻止键盘的代码 - 方法:
// hide keyboard
View.OnClickListener disableKeyBoardListener = new View.OnClickListener() {
public void onClick(View v) {
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
};
((EditText) weightPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
((EditText) repetitionPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
((EditText) weightPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//((EditText) repetitionPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//weightPicker.setOnClickListener(disableKeyBoardListener);
//repetitionPicker.setOnClickListener(disableKeyBoardListener);
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
可悲的是,单击NumberPicker时仍会显示软键盘。有什么想法吗?
答案 0 :(得分:451)
刚刚发现这个,它就像一个魅力:
myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
您也可以在XML中设置:
android:descendantFocusability="blocksDescendants"
答案 1 :(得分:53)
安德鲁韦伯的Xml版本的答案
android:descendantFocusability="blocksDescendants"
实施例
<NumberPicker
android:id="@+id/your_numberpicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"/>
答案 2 :(得分:7)
通过阅读com / android / internal / widget / NumberPicker.java源代码后,我得到了以下解决方案:
// Hide soft keyboard on NumberPickers by overwriting the OnFocusChangeListener
OnFocusChangeListener fcl = new OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
// Do nothing to suppress keyboard
}
};
((EditText) numberPicker.getChildAt(1)).setOnFocusChangeListener(fcl);
// Suppress soft keyboard from the beginning
((EditText) numberPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
答案 3 :(得分:6)
刚刚增强了@MaxVogler的ans(所以如果也投票给@MaxVogler这个投票)并使其成为一个强大的黑客。我们也不需要致电setOnFocusChangeListener
和setInputType
。只有setFocusable
为false才能执行。
以下是启用/禁用功能的帮助程序api
public static void enableNumberPickerManualEditing(NumberPicker numPicker,
boolean enable) {
int childCount = numPicker.getChildCount();
for (int i = 0; i < childCount; i++) {
View childView = numPicker.getChildAt(i);
if (childView instanceof EditText) {
EditText et = (EditText) childView;
et.setFocusable(enable);
return;
}
}
}
答案 4 :(得分:4)
这是另一种方法,它允许用户仍然可以编辑数字 - 如果他们想要 - 它只是最初抑制软键盘。根据上面的答案,当界面首次显示时,使用 NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
来取消软键盘。然后让您的对话或活动实施View.OnTouchListener
,在setOnTouchListener(this)
上致电NumberPicker
,并在onTouch(View v,MotionEvent e)
的实施中将numberpicker后代的焦点重置为正常值,然后返回假的。
返回false意味着仍然通过NumberPicker处理触摸,这意味着如果用户点击编辑框,则会出现软键盘。这恰好就是我想要遇到的同样问题 - 当第一次显示时,软键盘出现对话框会令人不悦,因为它在出现后会将对话框移开。
public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {
在 onCreateDialog()
方法中创建对话框并找到NumberPicker后
:
m_oldFocus = m_numberpicker.getDescendantFocusability();
m_numberpicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
m_numberpicker.setOnTouchListener(this);
这是OnTouch方法:
public boolean onTouch(View v, MotionEvent event) {
m_numberpicker.setDescendantFocusability(m_oldFocus);
return false;
}
答案 5 :(得分:2)
我发现最简单的工作是:
numberPicker = (NumberPicker) myDialogView.findViewById(R.id.myViewId);
EditText numberPickerChild = (EditText) numberPicker.getChildAt(0);
numberPickerChild.setFocusable(false);
numberPickerChild.setInputType(InputType.TYPE_NULL);
答案 6 :(得分:1)
我不知道它为什么会起作用,但是设置OnClickListener并没有阻止键盘显示(Lollipop)
numberPicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
答案 7 :(得分:1)
如果您只想在使用数字选择器加载视图时隐藏软件键盘,但仍希望用户能够在视图加载后进行编辑,那么您不应该阻止后代的可聚焦性。相反,只需阻止数字选择器成为您视图中的第一个焦点项目。
有关详细信息,请参阅this answer。
基于以上答案:
<!-- Dummy item to prevent Number Picker from receiving focus -->
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<NumberPicker
android:id="@+id/number_picker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:nextFocusUp="@id/number_picker"
android:nextFocusLeft="@id/number_picker"/>
答案 8 :(得分:0)
/**
* set focus to top level window
* disposes descendant focus
* disposes softInput
* @param context - activity context
* @param enable - state of focus
* */
public static void topLevelFocus(Context context, boolean enable){
if(Activity.class.isAssignableFrom(context.getClass())){
ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
if(tlView!=null){
tlView.setFocusable(enable);
tlView.setFocusableInTouchMode(enable);
tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
tlView.requestFocus();
}
}
}
*称之为:
不会阻止后代聚焦(numberpicker可编辑)
将在创建
之前(处理输入)getValue()将允许获得正确的walue
答案 9 :(得分:0)
工作代码 以编程方式:
mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
XML:
android:descendantFocusability="blocksDescendants"
答案 10 :(得分:0)
此扩展很不错,它不会忘记如何做并具有可读的代码。它有点隐藏实现细节,但是在这种情况下,我认为这是可以接受的:
fun NumberPicker.disableTextEditing(disable: Boolean) {
descendantFocusability = if (disable) FOCUS_BLOCK_DESCENDANTS else FOCUS_BEFORE_DESCENDANTS
}