为什么文本键盘显示在Android的TimePicker的onScroll上?

时间:2019-01-24 11:14:16

标签: android android-softkeyboard timepicker

使用设置为TimePicker的{​​{1}}模式时,如果单击数字(分钟或小时),则会显示数字键盘。

但是,每当我滚动任何微调框时,键盘就会变为文本spinner

如何避免这种情况?

我尝试调用inputType并设置一个timePicker.setAddStatesFromChildren(true),但这是行不通的,因为如果我滚动得足以使微调器移动但不能改变时间,则监听器不会被触发,但是键盘仍然会变为文本OnTimeChangedListener

此外,inputType并不是我想要的,因为我仍然希望键盘显示出来,只是它不会将其timePicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS)更改为inputType

2 个答案:

答案 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中使用此属性,它将解决您的问题。