Cómo mostrar el teclado virtual en la actividad nativa
Cuando intento utilizar ANativeActivity_showSoftInput()
, no ANativeActivity_showSoftInput()
el teclado suave.
He intentado usar ANativeActivity_showSoftInput(engine->app->activity, ANATIVEACTIVITY_SHOW_SOFT_INPUT_FORCED)
y ANativeActivity_showSoftInput(engine->app->activity, ANATIVEACTIVITY_SHOW_SOFT_INPUT_IMPLICIT)
para mostrar softinput, pero también falló.
- ¿Cómo obtener el nivel de Compensación de exposición de la cámara del teléfono Android, a través de Java, cuando se toma la foto?
- Multithreading en Android
- Cómo llamar a javascript desde Android?
- Comprobar si la aplicación está abierta durante un evento de GCM onMessage?
- ORMLite JOINs o mapeo automático de rawQuery
He leído el código fuente, y he encontrado después de iniciar nativeActivity
, NativeContentView(extend View)
se creará, y cuando se llama ANativeActivity_showSoftInput
, se llamará showSoftInput()
en el lado de java. Creo que tal vez el teclado no está encendido.
¿Me puedes ayudar?
- ¿Cómo enviar notificaciones a la aplicación de Android desde el servidor de Java mediante GCM?
- El método no estático 'getSharedPreferences (java.lang.String, int)' no se puede referenciar desde un contexto estático
- 'Debe sustituir un método de superclase' Errores después de importar un proyecto en Eclipse
- Obteniendo una imagen mediana de la secuencia de imágenes con OpenCV
- Uso de un adaptador de otra clase / actividad
- Cómo acceder a la base de datos SQLite dentro de un archivo zip - android
- ¿Cómo puedo cambiar el color del borde blanco al usar RatioResolutionPolicy en AndEngine?
- Recibe todos los caracteres unicode de SoftInput cuando usa android NativeActivity
Tengo exactamente el mismo problema. No hay manera de mostrar el teclado utilizando esta API.
La única manera que encontré fue usar JNI pero por supuesto no estoy satisfecho con esa solución:
android_app* mApplication; ... void displayKeyboard(bool pShow) { // Attaches the current thread to the JVM. jint lResult; jint lFlags = 0; JavaVM* lJavaVM = mApplication->activity->vm; JNIEnv* lJNIEnv = mApplication->activity->env; JavaVMAttachArgs lJavaVMAttachArgs; lJavaVMAttachArgs.version = JNI_VERSION_1_6; lJavaVMAttachArgs.name = "NativeThread"; lJavaVMAttachArgs.group = NULL; lResult=lJavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs); if (lResult == JNI_ERR) { return; } // Retrieves NativeActivity. jobject lNativeActivity = mApplication->activity->clazz; jclass ClassNativeActivity = lJNIEnv->GetObjectClass(lNativeActivity); // Retrieves Context.INPUT_METHOD_SERVICE. jclass ClassContext = lJNIEnv->FindClass("android/content/Context"); jfieldID FieldINPUT_METHOD_SERVICE = lJNIEnv->GetStaticFieldID(ClassContext, "INPUT_METHOD_SERVICE", "Ljava/lang/String;"); jobject INPUT_METHOD_SERVICE = lJNIEnv->GetStaticObjectField(ClassContext, FieldINPUT_METHOD_SERVICE); jniCheck(INPUT_METHOD_SERVICE); // Runs getSystemService(Context.INPUT_METHOD_SERVICE). jclass ClassInputMethodManager = lJNIEnv->FindClass( "android/view/inputmethod/InputMethodManager"); jmethodID MethodGetSystemService = lJNIEnv->GetMethodID( ClassNativeActivity, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); jobject lInputMethodManager = lJNIEnv->CallObjectMethod( lNativeActivity, MethodGetSystemService, INPUT_METHOD_SERVICE); // Runs getWindow().getDecorView(). jmethodID MethodGetWindow = lJNIEnv->GetMethodID( ClassNativeActivity, "getWindow", "()Landroid/view/Window;"); jobject lWindow = lJNIEnv->CallObjectMethod(lNativeActivity, MethodGetWindow); jclass ClassWindow = lJNIEnv->FindClass( "android/view/Window"); jmethodID MethodGetDecorView = lJNIEnv->GetMethodID( ClassWindow, "getDecorView", "()Landroid/view/View;"); jobject lDecorView = lJNIEnv->CallObjectMethod(lWindow, MethodGetDecorView); if (pShow) { // Runs lInputMethodManager.showSoftInput(...). jmethodID MethodShowSoftInput = lJNIEnv->GetMethodID( ClassInputMethodManager, "showSoftInput", "(Landroid/view/View;I)Z"); jboolean lResult = lJNIEnv->CallBooleanMethod( lInputMethodManager, MethodShowSoftInput, lDecorView, lFlags); } else { // Runs lWindow.getViewToken() jclass ClassView = lJNIEnv->FindClass( "android/view/View"); jmethodID MethodGetWindowToken = lJNIEnv->GetMethodID( ClassView, "getWindowToken", "()Landroid/os/IBinder;"); jobject lBinder = lJNIEnv->CallObjectMethod(lDecorView, MethodGetWindowToken); // lInputMethodManager.hideSoftInput(...). jmethodID MethodHideSoftInput = lJNIEnv->GetMethodID( ClassInputMethodManager, "hideSoftInputFromWindow", "(Landroid/os/IBinder;I)Z"); jboolean lRes = lJNIEnv->CallBooleanMethod( lInputMethodManager, MethodHideSoftInput, lBinder, lFlags); } // Finished with the JVM. lJavaVM->DetachCurrentThread(); }
Otra forma es ir con una solución híbrida donde se extiende la NativeActivity en java y tiene funciones de ayuda para mostrar y ocultar el teclado.
import android.view.inputmethod.InputMethodManager; import android.content.Context; public class MyNativeActivity extends android.app.NativeActivity { public void showKeyboard() { InputMethodManager imm = ( InputMethodManager )getSystemService( Context.INPUT_METHOD_SERVICE ); imm.showSoftInput( this.getWindow().getDecorView(), InputMethodManager.SHOW_FORCED ); } public void hideKeyboard() { InputMethodManager imm = ( InputMethodManager )getSystemService( Context.INPUT_METHOD_SERVICE ); imm.hideSoftInputFromWindow( this.getWindow().getDecorView().getWindowToken(), 0 ); } }
Y en el lado nativo …
void DisplayKeyboard( bool bShow ) { // Attaches the current thread to the JVM. JavaVM* pJavaVM = m_pNativeActivity->vm; JNIEnv* pJNIEnv = m_pNativeActivity->env; JavaVMAttachArgs javaVMAttachArgs; javaVMAttachArgs.version = JNI_VERSION_1_6; javaVMAttachArgs.name = "NativeThread"; javaVMAttachArgs.group = NULL; jint nResult = pJavaVM->AttachCurrentThread( &pJNIEnv, &javaVMAttachArgs ); if ( nResult != JNI_ERR ) { // Retrieves NativeActivity. jobject nativeActivity = m_pNativeActivity->clazz; jclass ClassNativeActivity = pJNIEnv->GetObjectClass( nativeActivity ); if ( bShow ) { jmethodID MethodShowKeyboard = pJNIEnv->GetMethodID( ClassNativeActivity, "showKeyboard", "()V" ); pJNIEnv->CallVoidMethod( nativeActivity, MethodShowKeyboard ); } else { jmethodID MethodHideKeyboard = pJNIEnv->GetMethodID( ClassNativeActivity, "hideKeyboard", "()V" ); pJNIEnv->CallVoidMethod( nativeActivity, MethodHideKeyboard ); } // Finished with the JVM. pJavaVM->DetachCurrentThread(); } }
Esto le permite hacer frente a las cosas específicas de Android en java tal como estaba previsto y tener la llamada de código nativo en envolturas, reduciendo así la complejidad en la sintaxis en el lado nativo.
Tuve muchos problemas al intentar cerrar el teclado suave cuando la vista cambió, hasta que me di cuenta de que tenía que eliminarlo específicamente de la vista que lo llamaba:
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
También hay un método showSoftInput que probablemente debería funcionar (suponiendo que haga lo que el nombre del método dice que hace) de una manera similar, donde necesita una vista para anclarse a:
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText.getWindowToken(), 0);
Realmente no puedo probar esto en este momento, pero pensé que podría ayudarte y valdría la pena. Sólo asegúrese de que el "editText" está vinculado al EditText que desea recibir la entrada.
- No se puede cambiar el tamaño de los niños de diseño lineal en android reaccionar módulo nativo
- ¿El enlace JavaScript de JNI de Android pasa eficientemente TypedArray / ArrayBuffer a Java como una matriz?