J'utilise onKeyListener pour obtenir les événements onKey. Cela fonctionne bien avec le clavier normal. Mais cela ne fonctionne pas avec un clavier logiciel. Je suis seulement capable d'obtenir des événements onKey pour les chiffres et pas les alphabets. Est-il possible de résoudre ce problème? Toute forme d'aide sera grandement appréciée.OnKeyListener ne fonctionne pas avec un clavier logiciel (Android)
Répondre
Je ne crois pas qu'un OnKeyListener soit appelé du tout avec le clavier logiciel. Cela a quelque chose à voir avec le fait que le clavier logiciel est un périphérique IME et que les périphériques IME peuvent être autres que des claviers. Il semble que ce soit un peu inutile pour onKeyListener, puisqu'il ne fonctionne que sur les téléphones avec des claviers hardware. J'ai récemment travaillé autour de ce problème en utilisant TextWatcher dans le champ EditText dans mon activité au lieu d'utiliser OnKeyListener.
J'ai essayé d'utiliser TextWatcher mais j'ai besoin des événements KeyUp et KeyDown pour chaque touche enfoncée. Textwatcher me donne juste l'événement de clavier. –
Je ne pense pas qu'il soit possible d'écouter KeyUp et KeyDown depuis le clavier logiciel. –
onKeyListener a parfaitement fonctionné sur Android 1.5 via le clavier logiciel
A partir de Android 1.6 partir des touches de caractères et le nombre ne vont pas par l'événement OnKey, mais la touche DEL ne
Frustrant
Cette semble être spécifique à l'appareil. Je peux confirmer que cela fonctionne sur le Xoom et l'Acer A100. Toutefois, le Samsung Galaxy Tab Plus déclenche uniquement l'événement pour les boutons non-caractère. (Tous les appareils exécutant Honeycomb)
J'ai contourné cela en mettant l'auditeur dans sa propre méthode et en l'appelant à nouveau après la première fois. Dans l'onCreate, j'appelle setKeyListenerForEnter();
Alors, voici la méthode:
setKeyListenerForEnter public void() {
final EditText search_entry = (EditText) findViewById(R.id.search_entry);
search_entry.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
getSearchResults(v);
setKeyListenerForEnter();
return true;
}
return false;
}
});
}
Je ne sais pas si cela est une meilleure solution que la manipulation du clavier IME lui-même, mais il est une solution .
C'est probablement stupide, mais c'est comme ça que fonctionne Android pour le moment.
La documentation indique que les événements de clé ne seront propagés que pour les frappes de touches matérielles, et non pour les logiciels. Les fabricants d'appareils sont actuellement découragés de propager des événements de clavier logiciel par le biais d'auditeurs clés, bien qu'il incombe entièrement au fabricant d'honorer cela ou de traiter les claviers logiciels à la fois. À partir d'Android 4.2.2, le système Android lui-même ne prend pas en charge les événements de touches pour les claviers logiciels, de sorte que même les fabricants ne peuvent pas choisir leur chemin.
La seule option infaillible ici consiste à implémenter votre propre IME (clavier virtuel) et à gérer vous-même les frappes. TextWatcher peut être utilisé principalement pour remplacer les écouteurs de clé, cependant editText.setText (...); déclenchera également les événements TextWatcher, donc si vous êtes intéressé par les touches tapées seulement, alors TextWatcher n'est probablement pas non plus une solution.
Soyez prudent lorsque vous utilisez TextWatcher avec AutocomleteTextView ou EditText. Ne modifiez pas le texte dans le contenu AutocompleteTextView/EditText à partir d'événements TextWatcher, car sinon vous finirez probablement dans une boucle d'événement/écoute infinie.
Espérons que cela aide à clarifier les options disponibles, mais malheureusement, il ne fournit pas de solution de travail.
Décevant que Google a manqué sur cet aspect important de leur interface utilisateur.
setFocusableInTouchMode(true); //Enable soft keyboard on touch for target view
setFocusable(true); //Enable hard keyboard to target view
exemple:
public class CanvasView extends View{
public CanvasView(Context c){
super(c);
//enable keyboard
setOnKeyListener(new KeyBoard());
setFocusable(true);
setFocusableInTouchMode(true);
}
}
Pouvez-vous s'il vous plaît nous donner un exemple de la façon dont on peut utiliser ce code? Je l'ai essayé maintenant et ça ne semble pas fonctionner. – Simon
CanvasView public class Voir { \t \t CanvasView publique (Contexte c) { \t \t super (c); \t \t \t \t // activer le clavier \t \t setOnKeyListener (nouveau KeyBoard()); \t \t setFocusable (true); \t \t setFocusableInTouchMode (true); \t}} // activer le clavier pour canvasView – user3309567
Il semble étrange si vous obtenez des personnages, mais pas d'autres du clavier virtuel. Pouvez-vous poster le code de votre écouteur, et où vous l'attachez? –
public void onCreate (groupe savedInstanceState) { super.onCrée (savedInstanceState); setContentView (R.layout.login_screen); emailTxt = (EditText) findViewById (R.id.email); emailTxt.setOnKeyListener (nouveau OnKeyListener() { \t \t \t OnKey public boolean (Voir v, int codeTouche, événement KeyEvent) \t \t { \t \t \t Log.i ("Valeur clé", String. valeurDe (code de clé)); \t \t}); } –
Je ne fais que lire les clés pour le moment. –