Java — Android (NDK) openSoftInput в ландшафтном режиме

В настоящее время я портирую фреймворк на Android NDK. И мне приходится время от времени использовать экранную клавиатуру. Открытие и закрытие клавиатуры работает до сих пор ..

Но у меня проблема с фокусировкой клавиатуры в ландшафтном режиме (портретный режим работает нормально) — часть экрана, которую я покрасил в красный цвет, все еще реагирует на сенсорный ввод, как будто на нем не было клавиатуры, а затем один неокрашенный ряд клавиатуры работает как положено, а зеленоватая часть над клавиатурой не получает сенсорный ввод.

Клавиатура Фокус демонстрация

Я проверил это с помощью обычного приложения для Android. Тот же результат (код этого см. В конце вопроса).

Я открываю клавиатуру, когда нажимаю кнопку «Нажми меня!» кнопку и закройте его с помощью клавиши назад. Это код, который вызывается для открытия / закрытия:

//adapted from https://groups.google.com/d/msg/android-ndk/Tk3g00wLKhk/TJQucoaE_asJ
void AndroidCore::openOnScreenKeyboard(bool open){
// Attaches the current thread to the JVM.
jint lResult;
jint lFlags = 0;

JavaVM* javaVM = view->native_activity->vm;
JNIEnv* jniEnv;
bool attached = false;

if(javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) ==JNI_EDETACHED){
JavaVMAttachArgs attachArgs;
attachArgs.version = JNI_VERSION_1_6;
attachArgs.name = "NativeThread";
attachArgs.group = NULL;

jint result = javaVM->AttachCurrentThread(&jniEnv, &attachArgs);
if(result == JNI_ERR){
return;
}
attached = true;
}

// Retrieves Context.INPUT_METHOD_SERVICE.
jclass ClassContext = jniEnv->FindClass("android/content/Context");
jfieldID FieldINPUT_METHOD_SERVICE = jniEnv->GetStaticFieldID(ClassContext, "INPUT_METHOD_SERVICE", "Ljava/lang/String;");
jobject INPUT_METHOD_SERVICE = jniEnv->GetStaticObjectField(ClassContext, FieldINPUT_METHOD_SERVICE);

jclass ClassNativeActivity = jniEnv->FindClass("android/app/NativeActivity");
jobject lNativeActivity = view->native_activity->clazz;

// Runs getSystemService(Context.INPUT_METHOD_SERVICE).
jclass ClassInputMethodManager = jniEnv->FindClass("android/view/inputmethod/InputMethodManager");
jmethodID MethodGetSystemService = jniEnv->GetMethodID(ClassNativeActivity, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
jobject lInputMethodManager = jniEnv->CallObjectMethod(lNativeActivity, MethodGetSystemService, INPUT_METHOD_SERVICE);

// Runs getWindow().getDecorView().
jmethodID MethodGetWindow = jniEnv->GetMethodID(ClassNativeActivity, "getWindow", "()Landroid/view/Window;");
jobject lWindow = jniEnv->CallObjectMethod(lNativeActivity, MethodGetWindow);
jclass ClassWindow = jniEnv->FindClass("android/view/Window");
jmethodID MethodGetDecorView = jniEnv->GetMethodID(ClassWindow, "getDecorView", "()Landroid/view/View;");
jobject lDecorView = jniEnv->CallObjectMethod(lWindow, MethodGetDecorView);

// Runs lWindow.getViewToken()
jclass ClassView = jniEnv->FindClass("android/view/View");
jmethodID MethodGetWindowToken = jniEnv->GetMethodID(ClassView, "getWindowToken", "()Landroid/os/IBinder;");
jobject lBinder = jniEnv->CallObjectMethod(lDecorView, MethodGetWindowToken);

if (open) {
// Runs lInputMethodManager.showSoftInput(...).
jmethodID MethodShowSoftInput = jniEnv->GetMethodID(ClassInputMethodManager, "showSoftInput", "(Landroid/view/View;I)Z");
jboolean lResult = jniEnv->CallBooleanMethod(lInputMethodManager, MethodShowSoftInput, lDecorView, lFlags);
} else {
// lInputMethodManager.hideSoftInput(...).
jmethodID MethodHideSoftInput = jniEnv->GetMethodID(ClassInputMethodManager, "hideSoftInputFromWindow", "(Landroid/os/IBinder;I)Z");
jboolean lRes = jniEnv->CallBooleanMethod(lInputMethodManager, MethodHideSoftInput, lBinder, lFlags);
}

// Finished with the JVM.
javaVM->DetachCurrentThread();
}

Java-код с похожей проблемой:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);

button.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
InputMethodManager keyboard = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(getWindow().getDecorView(), 0);
//same with showSoftInput(button, 0);
}
});
}

Так кто-нибудь может представить, почему эта проблема с фокусом происходит? И может ли кто-нибудь помочь мне решить эту проблему?

Спасибо!

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector