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ó.

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?

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.

  • Obteniendo clase por su nombre
  • ¿Cómo puedo establecer alarmas exactas y repetitivas en Android 4.4?
  • Twitter Composer Callback OnSuccess / Tela OnFailure
  • Cómo conectar Android con MySQL usando el controlador Mysql JDBC
  • Java.io.invalidClassException durante la serialización / deserialización
  • ¿Dónde guardar imágenes en Android?
  • NoClassDefFoundError: Resolución fallida de: Lokhttp3 / internal / Platform
  • Android AudioRecord forzando otro flujo a la fuente de audio MIC
  • AsycTask Lanzar IllegalStateException - Fragmento no conectado a la actividad
  • ¿Cómo puedo modificar un mapa de bits de Android en el NDK para que pueda utilizarlo en Java?
  • Esperando hasta que la ubicación esté encendida después de encenderla a través de la alerta de servicios de ubicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.