Rozwijamy niezależną grę dla Androida i chcemy, aby użytkownik wybrał swój pseudonim. Zdecydowaliśmy się użyć Natywnej Aktywności dostarczonej przez NDK, ponieważ wydawało się, że jest to najłatwiejsza droga.Awaria podczas zamykania miękkiej klawiatury podczas korzystania z natywnej aktywności
Pierwszym problemem się spotkałem z klawiaturą było to, że ANativeActivity_showSoftInput function() wydaje się zrobić nic w ogóle (jak opisano np here), więc wywołać klawiaturę za pomocą JNI wzywa do działania:
static void showKeyboard(Activity activity) {
String s = Context.INPUT_METHOD_SERVICE;
InputMethodManager m = (InputMethodManager)activity.getSystemService(s);
View w = activity.getWindow().getDecorView();
m.showSoftInput(w, 0);
}
Działa to dobrze na klawiaturze i działa dobrze na niektórych urządzeniach razem. Ale na innych urządzeniach (np Nexus 7), gdy użytkownik próbuje zamknąć klawiaturę naciskając „ukryć klawiaturę” przycisk aplikacja zawiesza z tego wyjścia debugowania:
I/InputDispatcher( 453): Application is not responding: AppWindowToken{429b54a8 token=Token{42661288 ActivityRecord{41bb0b00 u0 com.example.project/android.app.NativeActivity}}} - Window{420d6138 u0 com.example.project/android.app.NativeActivity}. It has been 5006.7ms since event, 5005.6ms since wait started. Reason: Waiting because the focused window has not finished processing the input events that were previously delivered to it.
I/WindowManager( 453): Input event dispatching timed out sending to com.example.project/android.app.NativeActivity
Następnie użytkownik jest przedstawiona z okna pudełko z napisem:
Project isn't responding. Do you want to close it? [Wait]/[OK]
Czy jest coś, co robimy oczywiście źle? A może to błąd? Wydaje się, że takie problemy jak this one sugerują, że funkcjonalność klawiatury nigdy nie została właściwie zaimplementowana w natywnym kleju.
Na marginesie, nie testowaliśmy jeszcze na wielu urządzeniach, ale te, na których się nie zawiesił, to te ze starszym systemem operacyjnym Android. Ponadto w przypadku wystąpienia awarii, po pojawieniu się klawiatury, zmienia ona przycisk z tego, który wygląda tak, jak ten na taki, który wygląda tak, jak ten
. Być może odpowiada to innemu incydentowi wejściowemu, którego nie uwzględniono przy opracowywaniu pierwotnego kleju? Tylko zgaduję .
W każdym razie, jeśli ktoś ma klawiaturę działającą w trybie natywnym, poinformuj nas, jak to zrobiłeś.
Cheers
UPDATE
Donoszono jako błąd w Androidzie here, chcielibyśmy nadal być szczęśliwy, aby usłyszeć o obejściach chociaż. Jeśli jesteś nim dotknięty, możesz oddać głos w tej sprawie (naciskając gwiazdkę).
I całkowicie brakowało, że o wiele lepiej niż łatanie C-plik, dziękuję. –
Przez przypadek dostałam uaktualnienie dla mojego Nexus dziś i wydaje się, że problem został rozwiązany w systemie Android 4.3. Twoja sugestia ułatwia stosowanie poprawionej funkcji process_input tylko wtedy, gdy wersja Androida ma 4.2. Jeśli chcesz, możesz połączyć i moje odpowiedzi, aby zapewnić jedno ostateczne rozwiązanie dla innych. Oznaczę to jako ostateczną odpowiedź. W przeciwnym razie, jeśli sobie przypomnę, spróbuję to zrobić w przyszłym tygodniu. Twoje zdrowie. –
Jasne - aktualizowana. Zauważyłem również, że problem został rozwiązany w 4.3! Szkoda, że będzie się utrzymywał na rynku na telefonach 4.1 i 4.2 przez chwilę ... – krsteeve