La création d'un SoftKeyboard avec Plusieurs autres caractères par touche
J'ai suivi les exemples sur developer.android.com concernant Les Méthodes De Saisie et joué avec les SoftKeyboard exemple d'application. Ensemble, ils donnent plus de suffisamment d'informations concernant la création de clavier simple.
Ce que je ne peux pas voir dans l'API, c'est la capacité à créer une variante de /plusieurs caractères par touche qui est disponible sur le Clavier standard (LatinIME Clavier).
L'image ci-dessus est le résultat d'une pression longue sur la touche "a". Lorsque vous appuyez sur une touche, il est possible de remplir un popup avec d'autres caractères.
Il est également possible de donner un popup astuce sur certaines touches qui invite l'utilisateur à appuyer sur et maintenez une touche pour obtenir le menu contextuel.
Jusqu'à présent, je n'ai pas trouvé une source unique d'informations sur la façon dont cela est réalisé, j'espère que quelqu'un pourra me donner une longueur d'avance, jusqu'alors, je vais suivre le code source du clavier intégré et voir si je peux la recréer.
Edit: aiderait si developer.android.com s 'lien vers le LatinIME Clavier n'a pas de lien vers l'image d'un Les moutons 🙂 code source pour LatinIME.java.
Edit 2: Plus comme une référence que tout autre chose, c'est la séquence, je crois, une habitude, appuyez de manière prolongée sur l'action va de travers pour afficher la fenêtre contextuelle du clavier dans KeyboardView.java:
onTouchEvent()
onModifiedTouchEvent()
mHandkler.handleMessage() with MSG_LONGPRESS
openPopupIfRequired()
onLongPress()
Edit 3:
Je n'ai toujours pas compris Comment faire ajouter une étiquette suggestions de clés? Une réponse suggère qu'il n'est pas intégré dans l'API, et en effet je n'ai pas trouvé la codeto ce faire. Toutefois, le Clavier sur 2.3.4 API (10), cette fonctionnalité étant mis en œuvre:
Voudrais bien comprendre comment IL fait, mais ce n'est pas n'importe où dans le onDraw()
méthode que je peux voir - ce qui me fait croire qu'il a été écrit à l'extérieur de la KeyboardView élément. Je ne peux cependant trouver le layout
de fichier utilisé pour afficher le KeyboardView élément sur le clavier intégré - Si quelqu'un sait où trouver ce peut-être qui me donnera l'idée dont j'ai besoin.
Edit 4: Déplacé touche Aperçu de la question ici, c'est légèrement hors sujet:
Comment avez-vous désactiver le SoftKeyboard touche de prévisualisation de la fenêtre?
- Avez-vous trouvé une solution complète de mise en place des popups? veuillez mettre à jour
Vous devez vous connecter pour publier un commentaire.
La mise en œuvre de autre touche contextuelle:
Pour chaque touche que vous souhaitez avoir un clavier virtuel, vous devez définir le popupCharacters et popupKeyboard:
/res/xml/[Keyboard].xml
La
popupKeyboard
est une représentation XML du clavier dans la fenêtre contextuelle contenant les touches secondaires:/res/xml/keyboard_popup_template.xml
Style l'autre touche contextuelle:
Si vous souhaitez modifier la mise en page/le style du pop-up (qui est par défaut @android:mise en page/keyboard_popup_keyboard.xml), vous pouvez spécifier un
android:popupLayout
attribut qui pointe vers un fichier de mise en page:La Mise En Œuvre De La Clé Aperçu De Superposition:
La seule solution que j'ai été en mesure de frapper à montrer touche de prévisualisation (Sans entièrement réécrire le KeyboardView code source) est ci-dessous:
Emballage de la
<KeyboardView>
balise avec un<FrameLayout>
avec une hauteur spécifiée par la multiplication de la keyHeight par le nombre de lignes. À l'intérieur de cette balise, j'ai tout simplement créé un LinearLayout de tenir les lignes, puis un LinearLayout pour chaque ligne contenant un TextView avec un poids égal à l' %p valeur spécifiée pour chaque<Key>
:Et de style:
Qui produit ce:
Je ne serai pas heureux jusqu'à ce que j'ai réussi à mettre en œuvre la présente de la même manière que le Clavier ne!
À en juger par ma propre tentative de codage d'un softkeyboard j'ai découvert que:
KeyboardView
et essentiellement écrire de grandes parties du code de dessin. Malheureusement, vous ne peut pas le faire en remplaçant certaines des principales méthodes puisque presque tout est privé. Vous voudrez peut-être jeter un coup d'oeil (et d'emprunter un peu de code à partir de:(base)/core/java/android/inputmethodservice/KeyboardView.java
(android code de base repo)(apps)/other/LatinIME/LatinKeyboardView.java
(android applications de base repo)Noter que les moutons sur android.kernel.org est-il pour vous dire que l'opération est fermé pour cause de craquelins, mais il y a des miroirs du code ailleurs (perdu les liens malheureusement)
KeyboardView
a pas soutien à l'ombre de la clé des conseils, vous devez votre propre code de KeyboardView pour avoir une chance de remplacer le onDraw() la méthode.Maintenant sur ce que vous peut faire:
Vous pouvez contourner ce problème en fournissant des photos de la remise des clés: utilisation de xml
<Key ... android:keyIcon="@drawable/this_key_icon_file />
pour cela. Malheureusement, vous allez certainement avoir des résultats médiocres pour les lettres avec cette méthode (résolution de problèmes).Vous pouvez utiliser (et de configurer l'apparence de l') clavier virtuel qui s'affiche sur appuyez longuement sur.
Déclarer un clavier de modèle de
res/xml/kbd_popup_template.xml
:Déclarer les valeurs de chaîne contenant les touches que vous souhaitez sur ce clavier
res/values/strings.xml
:Ensuite, utilisez à la fois dans la disposition de votre clavier définition:
Vous pouvez également utiliser le double-tap, triple-tap, ... fonctionnalité permettant de générer des remplaçants pour la clé que vous êtes en appuyant sur. Pour ce faire, il suffit d'utiliser un liste pour android codes de touches:
<Key android:codes="97,224,230" .../>
produira 97='
a
" pour seul robinet, 224='à
' pour le double-tap et 230='æ
" pour triple-tap.La durée de considérer double-tapping est mis à 800ms dans le code source android. C'est malheureusement codé en dur (et un peu haut, je me sens).
Être conscient que, lors d'un double-tapping, il envoie un "
a
" d'abord, puis, sur la deuxième répétition, il envoie 'à
'. Certaines applications, ne sera pas comme ça.Que le clavier virtuel avec le bouton de fermeture est ennuyeux lorsque nous avons un seul popup caractère.
Plus simple est de remplacer la onLongPress méthode de KeyboardView classe comme ça.
Si vous voulez avoir un texte sur le dessus de votre clé, vous pouvez le faire dans onDraw() dans votre classe qui remplace KeyboardView
switch(key.codes[0]) { ... }
déclaration d'accélérer le code.Pour toute personne essayant de rejeter la fenêtre contextuelle du clavier en appuyant sur l'extérieur de sa zone d'affichage, j'ai eu un peu de chance de mettre un
TouchListener
sur leKeyboardView
à l'intérieur de la classe étendantInputMethodService
si vous voulez avoir un texte sur le dessus de votre clé, vous pouvez le faire dans onDraw() dans votre classe qui étend la classe KeyboardView j'ai fait quelque chose comme cela, cela pourrait peut-être aider quelqu'un
ajuster ces axes selon votre choix