Как заставить Android Soft Keyboard открываться из собственного кода? - PullRequest
3 голосов
/ 13 сентября 2011

У меня есть игра, в которой используется обратный вызов Java из C ++ для принудительного открытия программной клавиатуры, когда пользователь касается экрана.Код Java просто так:

this._inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

Некоторое время это работало нормально, но недавно мы получили жалобы от некоторых пользователей Motorola Droid, что программная клавиатура не открывается для них.Так как мы только недавно начали получать эти жалобы, и это число пользователей, я думаю, это было какое-то обновление для этих устройств.

Есть ли лучший способ заставить клавиатуру открыться?Все ссылки, которые я нахожу в Интернете, говорят об использовании элементов управления текстовым полем и тому подобное, но мое приложение в основном C ++ и вообще не использует стандартные элементы управления.

1 Ответ

5 голосов
/ 15 сентября 2011

Я не знаю, связано ли это с вашей проблемой, но я столкнулся с некоторыми проблемами, используя только InputMethodManager.toggleSoftInput (), когда устройства иногда выходили из синхронизации и скрывались, когда я хотел показать, и наоборот .

Я добился определенного успеха, воспользовавшись тем, что хотя IMM.showSoftInput () не будет показывать клавиатуру, IMM.hideSoftInputFromWindow () будет надежно закрывать одну поэтому, когда я хочу показать клавиатуру, я теперь вызываю IMM.hideSoftInputFromWindow (), а затем IMM.toggleSoftInput () и использую IMM.hideSoftInputFromWindow (), чтобы скрыть ее.

[Через день ...]

Запись вышеупомянутого вчера заставила меня переосмыслить то, как я имел дело с программной клавиатурой (я имею в виду, showSoftinput () работает , просто не так, как мы ожидали), и вот лучший способ сделать это:

Во-первых, вам нужно настроить вид так, чтобы Android знал, что у него может быть программная клавиатура - как описано в документации для InputMethodManager. В моем случае у меня есть одно представление, полученное из GLSurfaceView, и поэтому я добавил:

setFocusable(true);
setFocusableInTouchMode(true);

конструктору, а затем следующие 2 переопределения:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs)
{
    outAttrs.actionLabel = "";
    outAttrs.hintText = "";
    outAttrs.initialCapsMode = 0;
    outAttrs.initialSelEnd = outAttrs.initialSelStart = -1;
    outAttrs.label = "";
    outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI;        
    outAttrs.inputType = InputType.TYPE_NULL;        

    return  new BaseInputConnection(this, false);       
}     

@Override
public boolean onCheckIsTextEditor ()
{
    return true;
}

Теперь я могу показать клавиатуру с:

InputMethodManager mgr = (InputMethodManager)mActivity.getSystemService(Context.INPUT_METHOD_SERVICE); 
mgr.showSoftInput(mView, 0);

и нажатия клавиш сообщаются через методы onKeyUp () и onKeyDown () представления.

Скрытие все еще выполняется с помощью hideSoftInputFromWindow ()

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