Как отобразить программную клавиатуру из сервиса? - PullRequest
9 голосов
/ 03 августа 2011

Краткий вопрос: Можно ли (и как) отобразить программную клавиатуру из службы?

Длинный вопрос: Я написал сервис, который создает «верхнюю панель», отображаемую поверх всех действий, содержащую EditText. Я хочу отобразить экранную клавиатуру при нажатии на EditText, но этого не происходит.

Конечно, я попробовал это из onFocusChange () и onClick () службы:

InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

Обходной путь, который я нашел, - запросить текущее действие, чтобы показать клавиатуру, расширив класс Activity и добавив интерфейс AIDL. Недостатком является то, что каждое ключевое событие должно быть отправлено обратно в Сервис (через другой интерфейс AIDL) и вручную преобразовано в Unicode.

Более того, если текущее действие содержит EditText, программная клавиатура работает только для этого действия и больше не отображается, когда выбран EditText службы.

Что мешает отображать программную клавиатуру службы, если текущее действие имеет EditText? Может ли это быть ограничение Android?

Ответы [ 3 ]

1 голос
/ 24 ноября 2015

У меня похожая проблема. Но в моем случае проблема связана с использованием WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE флага при создании WindowManager.LayoutParams для просмотра.

И для видимости клавиатуры

InputMethodManager inputManager = (InputMethodManager) context.
                getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputManager != null) {
            inputManager.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
        } 
0 голосов
/ 24 сентября 2018

Я столкнулся с подобной проблемой. Я решил это сейчас. Может быть, уже слишком поздно, но может кому-то это поможет. Возможная причина ошибки: Установка FLAG_NOT_FOCUSABLE во время LayoutParams

Флаг окна: это окно никогда не получит фокус ввода, поэтому пользователь не может отправить ключ или другие события кнопки к нему. Те будут вместо к любому фокусируемому окну позади него.

Просто замените FLAG_NOT_FOCUSABLE на 0

Используйте этот код ниже:

InputMethodManager imm = null;

mView.findViewById(R.id.editText).setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(hasFocus){
                    if(imm==null){
                        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    }

                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0 );
                }
            }
        });

2-й при создании LayoutParams

private WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                    0,
                    PixelFormat.TRANSLUCENT);
0 голосов
/ 02 января 2015

Если вы хотите показать Soft Keyboard при прикосновении к тексту редактирования, почему бы вам не рассмотреть возможность использования onTouchListener с этим текстом редактирования.Я верю, что edittext.requestfocus () также сделает это.Если нет, слушатель определенно сработает.

Более того, для вида, о котором вы упомянули, было бы лучше использовать фрагменты вместо службы для создания представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...