47 votes

Création d'un clavier logiciel avec plusieurs caractères / caractères alternatifs 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).

enter image description here

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.

enter image description here

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: Serait utile si developer.android.com s 'lien vers le LatinIME Clavier n'a pas de lien vers une photo d'un Mouton :) code source pour LatinIME.java.

Edit 2: Plus qu'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:

enter image description here

Voudrais bien comprendre comment IL fait, mais ce n'est pas n'importe où dans l' 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 l' layout le 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: touche Déplacée Aperçu de la question ici, c'est légèrement hors sujet:

Comment avez-vous désactiver / personnaliser le clavier touche de prévisualisation de la fenêtre?

57voto

Graeme Points 9167

La mise en œuvre de autre touche popup:

Pour chaque touche que vous souhaitez avoir un clavier virtuel, vous devez définir le popupCharacters et popupKeyboard:

/res/xml/[Keyboard].xml

<Key android:keyLabel="("
    android:popupKeyboard="@xml/keyboard_popup_template"
    android:popupCharacters="[{&lt;" />

L' popupKeyboard est une représentation XML du clavier dans la fenêtre contextuelle contenant les touches secondaires:

/res/xml/keyboard_popup_template.xml

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="10%p"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    android:keyHeight="56dp">
</Keyboard>

Le style de l'autre touche popup:

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:

<android.inputmethodservice.KeyboardView
    android:id="@+id/keyboard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="#FF272727"
    android:popupLayout="@layout/keyboard_popup_keyboard" />

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:

Habillage de l' <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>:

<TextView android:text="!" style="@style/Custom.Widget.KeyboardKeyOverlay"  android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="10"/>

Et de style:

<style name="CustomTheme.Widget.KeyboardKeyOverlay">
    <item name="android:background">@android:color/transparent</item>
    <item name="android:textColor">#FFAAAAAA</item>
    <item name="android:paddingRight">6dp</item>
    <item name="android:paddingTop">4dp</item>
    <item name="android:textSize">10sp</item>
    <item name="android:gravity">right</item>
    <item name="android:textStyle">bold</item>
</style>         

Qui produit ce:

enter image description here

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!

15voto

Laurent' Points 1987

À en juger par ma propre tentative de codage d'un softkeyboard j'ai trouvé que:

  • Nice/bling fonctionnalités nécessite généralement que vous étendez 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)

Notez que la brebis 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)

  • La base KeyboardView a pas de support pour 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 pouvez 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 cette. 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 modèle res/xml/kbd_popup_template.xml :

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="10%p"
    android:horizontalGap="0px"
    android:verticalGap="0px"
    android:keyHeight="@dimen/key_height">
</Keyboard>

Déclarer les valeurs de chaîne contenant les touches que vous souhaitez sur ce clavier res/values/strings.xml:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string name="alternates_for_a">àáâãäåæ</string>
</ressources>

Ensuite, utilisez à la fois dans la disposition de votre clavier définition:

<Key android:codes="97" android:keyLabel="a"  
    android:popupKeyboard="@xml/kbd_popup_template"
    android:popupCharacters="@string/alternates_for_a" />
  • 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 une 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 les 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).

Sachez que, lorsque vous 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.

12voto

Ganindu Points 51

Ce clavier contextuel avec le bouton de fermeture est ennuyeux lorsque nous n'avons qu'un seul caractère contextuel. Un moyen plus simple consiste à remplacer la méthode onLongPress de la classe KeyboardView comme celle-ci.

 @Override
protected boolean onLongPress(Key key) {
    if (key.codes[0] == '1') {
        getOnKeyboardActionListener().onKey('!', null);
        return true;
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X