使用设置为TimePicker
的{{1}}模式时,如果单击数字(分钟或小时),则会显示数字键盘。
但是,每当我滚动任何微调框时,键盘就会变为文本spinner
。
如何避免这种情况?
我尝试调用inputType
并设置一个timePicker.setAddStatesFromChildren(true)
,但这是行不通的,因为如果我滚动得足以使微调器移动但不能改变时间,则监听器不会被触发,但是键盘仍然会变为文本OnTimeChangedListener
。
此外,inputType
并不是我想要的,因为我仍然希望键盘显示出来,只是它不会将其timePicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS)
更改为inputType
。
答案 0 :(得分:1)
最后,我找不到哪个视图使键盘出现。我尝试从TimePicker内的每个视图中删除下一个焦点,但是什么也没有。然后,我想到的问题是,由于我使用的是24小时格式的微调器,因此应归咎于CustomTextView
中隐藏的AM / PM TimePicker
。我使它无法聚焦,但是仍然是同样的问题。因此,我得出结论,问题出在TimePicker本身的实现中,后者负责管理一些事件并显示键盘。
因此,我决定遍历NumberPicker
内的TimePicker
(三个),并在它们上设置一个OnScrollListener
以隐藏键盘。但是,我仍然可以看到文本键盘在被解雇之前就出现了。但这是我所能做到的最好的。
public static <T extends View> List<T> getViewsByClassNameFromView(ViewGroup viewGroup, Class<T> clazz) {
final List<T> matches = new LinkedList<>();
final int childCount = viewGroup.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = viewGroup.getChildAt(i);
if (clazz.isInstance(child)) {
matches.add((T) child);
} else if (child instanceof ViewGroup) {
matches.addAll(getViewsByClassNameFromView((ViewGroup) child, clazz));
}
}
return matches;
}
public void hideSoftKeyboard(View view) {
InputMethodManager imm =
(InputMethodManager) view.getContext().getApplicationContext()
.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
view.clearFocus();
}
private void fixTimePicker() {
final List<NumberPicker> numberPickers = ViewUtil.getViewsByClassNameFromView(timePicker, NumberPicker.class);
for (final NumberPicker numberPicker: numberPickers) {
numberPicker.setOnScrollListener(new NumberPicker.OnScrollListener() {
@Override
public void onScrollStateChange(NumberPicker view, int scrollState) {
hideSoftKeyboard(view);
}
});
}
}
答案 1 :(得分:0)
android:descendantFocusability =“ blocksDescendants”在DatePicker Xml中使用此属性,它将解决您的问题。