Почему текстовая клавиатура отображается на Android TimePicker onScroll? - PullRequest
0 голосов
/ 24 января 2019

При использовании TimePicker в режиме spinner, если я нажимаю на число (минуты или часы), отображается цифровая клавиатура.

image

But whenever I scroll any of the spinners, the keyboard changes to the text inputType.

image

Как мне этого избежать?

Я попытался позвонить timePicker.setAddStatesFromChildren(true) и установить OnTimeChangedListener, но это не сработает, поскольку, если я прокручиваю достаточно для вращения счетчика, но не для изменения времени, слушатель не запускается, но клавиатура все равно изменится на текст inputType.

Кроме того, timePicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS) - это не то, что я ищу, потому что я все еще хочу, чтобы клавиатура отображалась, но только для того, чтобы она не изменила inputType на text.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

В конце концов, я не смог найти вид, из-за которого появлялась клавиатура. Я пытался удалить следующий фокус из каждого представления внутри TimePicker, но ничего. Затем я подумал, что проблема заключалась в том, что, поскольку я использовал счетчик 24-часового формата, виноват был скрытый AM / PM CustomTextView внутри 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);
            }
        });
    }
}
0 голосов
/ 24 января 2019

android: downndantFocusability = "blocksDescendants" используйте этот атрибут в DatePicker Xml, и он решит вашу проблему.

...