Comment faire un clavier Android personnalisé?

je veux faire un clavier personnalisé. Je ne sais pas comment le faire dans xml et activité. Cette photo est mon modèle de clavier. Il n'a besoin que de chiffres.

enter image description here

60
demandé sur Suragch 2012-03-06 06:57:59

8 réponses

tout d'Abord, vous aurez besoin d'un keyboard.xml fichier sera placé dans le res/xml dossier (si le dossier n'existe pas, il a créé).

<?xml version="1.0" encoding="utf-8"?> 
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="15%p"
    android:keyHeight="15%p" >

    <Row>
        <Key android:codes="1"    android:keyLabel="1" android:horizontalGap="4%p"/>
        <Key android:codes="2"    android:keyLabel="2" android:horizontalGap="4%p"/>
        <Key android:codes="3"    android:keyLabel="3" android:horizontalGap="4%p" />
        <Key android:codes="4"    android:keyLabel="4" android:horizontalGap="4%p" />
        <Key android:codes="5"    android:keyLabel="5" android:horizontalGap="4%p" />
    </Row>
    <Row>
        <Key android:codes="6"    android:keyLabel="6" android:horizontalGap="4%p"/>
        <Key android:codes="7"    android:keyLabel="7" android:horizontalGap="4%p"/>
        <Key android:codes="8"    android:keyLabel="8" android:horizontalGap="4%p" />
        <Key android:codes="9"    android:keyLabel="9" android:horizontalGap="4%p" />
        <Key android:codes="0"    android:keyLabel="0" android:horizontalGap="4%p" />
    </Row>

    <Row>
        <Key android:codes="-1"    android:keyIcon="@drawable/backspace" android:keyWidth="34%p" android:horizontalGap="4%p"/>
        <Key android:codes="100"    android:keyLabel="Enter" android:keyWidth="53%p" android:horizontalGap="4%p"/>
    </Row>
 </Keyboard>

**notez que vous devrez créer le backspace et le placer dans le dossier res/drawable-ldpi avec une très petite taille (comme 18x18 pixels)

Puis dans le fichier xml que vous voulez qu'il soit utilisé (TextView), vous devez ajouter le code suivant:

<RelativeLayout
 ...
>

        .....


        <android.inputmethodservice.KeyboardView
             android:id="@+id/keyboardview"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true"
             android:layout_centerHorizontal="true"
             android:focusable="true"
             android:focusableInTouchMode="true"
             android:visibility="gone" 
         />

        ......


</RelativeLayout>

**notez que le fichier xml dans lequel vous placez le android.inputmethodservice.KeyboardView , doit être RelativeLayout pour pouvoir définir le alignParentBottom="true" (habituellement les claviers sont présentés en bas de l'écran)

ensuite, vous devez ajouter le code suivant dans la fonction onCreate de la Activity qui gère le TextView vous voulez attacher le clavier à

    // Create the Keyboard
    mKeyboard= new Keyboard(this,R.xml.keyboard);

    // Lookup the KeyboardView
    mKeyboardView= (KeyboardView)findViewById(R.id.keyboardview);
    // Attach the keyboard to the view
    mKeyboardView.setKeyboard( mKeyboard );

    // Do not show the preview balloons
    //mKeyboardView.setPreviewEnabled(false);

    // Install the key handler
    mKeyboardView.setOnKeyboardActionListener(mOnKeyboardActionListener);

* * noter que mKeyboard et mKeyboardView sont des variables de classe privée que vous devez créer.

ensuite, vous avez besoin de la fonction suivante pour ouvrir le clavier ( vous devez l'associer avec le TextView à travers le onClick propriété xml)

    public void openKeyboard(View v)
    {
       mKeyboardView.setVisibility(View.VISIBLE);
       mKeyboardView.setEnabled(true);
       if( v!=null)((InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
    }

et enfin vous avez besoin du OnKeyboardActionListener qui gérera vos événements

private OnKeyboardActionListener mOnKeyboardActionListener = new OnKeyboardActionListener() {
    @Override public void onKey(int primaryCode, int[] keyCodes) 
    {
         //Here check the primaryCode to see which key is pressed 
         //based on the android:codes property
         if(primaryCode==1)
         {
            Log.i("Key","You just pressed 1 button");
         }
    }

    @Override public void onPress(int arg0) {
    }

    @Override public void onRelease(int primaryCode) {
    }

    @Override public void onText(CharSequence text) {
    }

    @Override public void swipeDown() {
    }

    @Override public void swipeLeft() {
    }

    @Override public void swipeRight() {
    }

    @Override public void swipeUp() {
    }
};

Espère que ça aide!!!

la plupart du code trouvé ici

61
répondu Pontios 2017-07-20 13:22:18

Utilisation KeyboardView :

KeyboardView kbd = new KeyboardView(context);
kbd.setKeyboard(new Keyboard(this, R.xml.custom));

kbd.setOnKeyboardActionListener(new OnKeyboardActionListener() {
    ....
}

maintenant, vous avez kbd , qui est une vue normale.

la chose agréable à ce sujet est que R.xml.custom se réfère à /res/xml/custom.xml , qui définit en xml la disposition du clavier. Pour plus d'informations sur ce fichier, regardez ici: clavier , clavier.Ligne , Clavier.La touche .

30
répondu bigstones 2012-08-12 16:20:03

clavier

Cette réponse indique comment personnaliser un système de clavier qui peut être utilisé dans n'importe quelle application que l'utilisateur a installé sur leur téléphone. Si vous voulez faire un clavier qui ne sera utilisé que dans votre propre application, alors voir mon autre réponse .

L'exemple ci-dessous ressemblera à ceci. Vous pouvez la modifier pour n'importe quel clavier.

enter image description here

Les étapes suivantes montrent comment créer un système personnalisé clavier. Autant que possible, j'ai essayé de supprimer tout code inutile. S'il y a d'autres fonctionnalités dont vous avez besoin, j'ai fourni des liens pour plus d'aide à la fin.

1. Démarrer un nouveau projet Android

j'ai nommé mon projet"Custom Keyboard". Appelez ça comme vous voulez. Il n'y a rien d'autre de spécial ici. Je vais juste laisser le MainActivity et "Bonjour Monde!"mise en page comme il est.

2. Ajouter les fichiers de mise en page

ajoutez les deux fichiers suivants dans le dossier res/layout de votre application:

  • keyboard_view.xml
  • key_preview.xml

keyboard_view.xml

cette vue est comme un conteneur qui tiendra notre clavier. Dans cet exemple, il y a un seul clavier, mais vous pouvez ajouter d'autres claviers et les échanger dedans et dehors. KeyboardView .

<?xml version="1.0" encoding="utf-8"?>
<android.inputmethodservice.KeyboardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/keyboard_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:keyPreviewLayout="@layout/key_preview"
    android:layout_alignParentBottom="true">

</android.inputmethodservice.KeyboardView>

key_preview.xml

l'aperçu des touches est une mise en page qui apparaît lorsque vous appuyez sur une touche de clavier. Il montre juste quelle clé vous appuyez (au cas où vos gros, gros doigts le couvrent). Ce n'est pas un popup à choix multiple. Pour cela, vous devriez consulter le vue des candidats .

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:background="@android:color/white"
    android:textColor="@android:color/black"
    android:textSize="30sp">
</TextView>

3. Ajouter les fichiers xml de soutien

créez un dossier xml dans votre dossier res . (Clic droit sur res et choisissez nouveau > répertoire .)

ajouter Ensuite les deux fichiers xml. (Cliquez à droite sur le dossier xml et choisissez nouveau > fichier de ressources XML .)

  • number_pad.XML
  • la méthode.xml

number_pad.xml

c'est là que ça commence à devenir plus intéressant. Ce Keyboard définit la disposition des clés .

<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
    android:keyWidth="20%p"
    android:horizontalGap="5dp"
    android:verticalGap="5dp"
    android:keyHeight="60dp">

    <Row>
        <Key android:codes="49" android:keyLabel="1" android:keyEdgeFlags="left"/>
        <Key android:codes="50" android:keyLabel="2"/>
        <Key android:codes="51" android:keyLabel="3"/>
        <Key android:codes="52" android:keyLabel="4"/>
        <Key android:codes="53" android:keyLabel="5" android:keyEdgeFlags="right"/>
    </Row>

    <Row>
        <Key android:codes="54" android:keyLabel="6" android:keyEdgeFlags="left"/>
        <Key android:codes="55" android:keyLabel="7"/>
        <Key android:codes="56" android:keyLabel="8"/>
        <Key android:codes="57" android:keyLabel="9"/>
        <Key android:codes="48" android:keyLabel="0" android:keyEdgeFlags="right"/>
    </Row>

    <Row>
        <Key android:codes="-5"
             android:keyLabel="DELETE"
             android:keyWidth="40%p"
             android:keyEdgeFlags="left"
             android:isRepeatable="true"/>
        <Key android:codes="10"
             android:keyLabel="ENTER"
             android:keyWidth="60%p"
             android:keyEdgeFlags="right"/>
    </Row>

</Keyboard>

Voici quelques choses à noter:

  • keyWidth : C'est la valeur par défaut la largeur de chaque touche. Le 20%p signifie que chaque clé doit occuper 20% de la largeur du p arent. Il peut être écrasé par des touches individuelles, bien que, comme vous pouvez le voir arrivé avec les touches supprimer et entrer dans la troisième rangée.
  • keyHeight : il est codé dur ici, mais vous pourriez utiliser quelque chose comme @dimen/key_height pour le définir dynamiquement pour différentes tailles d'écran.
  • Gap : l'espace horizontal et vertical indique l'espace à laisser entre les touches. Même si vous mettez 0px il y a encore un petit écart.
  • codes : il peut s'agir d'une valeur Unicode ou de code personnalisé qui détermine ce qui se passe ou ce qui est entré lorsque la touche est pressée. Voir keyOutputText si vous voulez entrer une chaîne Unicode plus longue.
  • keyLabel : texte affiché sur la touche.
  • keyEdgeFlags : cela indique à quel bord la touche doit être alignée.
  • isRepeatable : si vous maintenez la touche enfoncée, elle continuera à répéter l'entrée.

méthode.xml

Ce fichier indique au système la méthode d'entrée sous-types qui sont disponibles. Je ne fais qu'inclure une version minimale ici.

<?xml version="1.0" encoding="utf-8"?>
<input-method
    xmlns:android="http://schemas.android.com/apk/res/android">

    <subtype
        android:imeSubtypeMode="keyboard"/>

</input-method>

4. Ajouter le code Java pour gérer l'entrée des clés

créer un nouveau fichier Java. Appelons-le MyInputMethodService . Ce fichier lie tout ensemble. Il traite les entrées reçues du clavier et les envoie à n'importe quelle vue qui les reçoit (un EditText , par exemple).

public class MyInputMethodService extends InputMethodService implements KeyboardView.OnKeyboardActionListener {

    @Override
    public View onCreateInputView() {
        // get the KeyboardView and add our Keyboard layout to it
        KeyboardView keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null);
        Keyboard keyboard = new Keyboard(this, R.xml.number_pad);
        keyboardView.setKeyboard(keyboard);
        keyboardView.setOnKeyboardActionListener(this);
        return keyboardView;
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {

        InputConnection ic = getCurrentInputConnection();
        if (ic == null) return;
        switch (primaryCode) {
            case Keyboard.KEYCODE_DELETE:
                CharSequence selectedText = ic.getSelectedText(0);
                if (TextUtils.isEmpty(selectedText)) {
                    // no selection, so delete previous character
                    ic.deleteSurroundingText(1, 0);
                } else {
                    // delete the selection
                    ic.commitText("", 1);
                }
                ic.deleteSurroundingText(1, 0);
                break;
            default:
                char code = (char) primaryCode;
                ic.commitText(String.valueOf(code), 1);
        }
    }

    @Override
    public void onPress(int primaryCode) { }

    @Override
    public void onRelease(int primaryCode) { }

    @Override
    public void onText(CharSequence text) { }

    @Override
    public void swipeLeft() { }

    @Override
    public void swipeRight() { }

    @Override
    public void swipeDown() { }

    @Override
    public void swipeUp() { }
}

Notes:

  • Le OnKeyboardActionListener écoute l'entrée du clavier. Il faut aussi toutes ces méthodes vides dans cet exemple.
  • le InputConnection est ce qui est utilisé pour envoyer des entrées à une autre vue comme un EditText .

5. Mettre à jour le manifeste

j'ai mis ce dernier plutôt que le premier parce qu'il se réfère aux fichiers que nous avons déjà ajoutés ci-dessus. Pour enregistrer votre clavier personnalisé en tant que clavier système, vous devez ajouter un service section à votre AndroidManifest.fichier xml . Mettez-le dans la section application après activity .

<manifest ...>
    <application ... >
        <activity ... >
            ...
        </activity>

        <service
            android:name=".MyInputMethodService"
            android:label="Keyboard Display Name"
            android:permission="android.permission.BIND_INPUT_METHOD">
            <intent-filter>
                <action android:name="android.view.InputMethod"/>
            </intent-filter>
            <meta-data
                android:name="android.view.im"
                android:resource="@xml/method"/>
        </service>

    </application>
</manifest>

C'est ça! Vous devriez être capable de lancer votre application maintenant. Cependant, vous ne verrez pas beaucoup jusqu'à ce que vous activez votre clavier dans les paramètres.

6. Activer le clavier dans les paramètres

Chaque utilisateur qui veut utiliser votre clavier aura pour l'activer dans le Les paramètres Android. Pour des instructions détaillées sur la façon de faire cela, voir le lien suivant:

voici un résumé:

  • Aller à Android Paramètres > Langue et saisie > clavier > claviers.
  • Vous devriez voir votre Clavier Personnalisé sur la liste. Activer.
  • revenir en arrière et choisir le clavier actuel à nouveau. Vous devriez voir votre Clavier Personnalisé sur la liste. Le choisir.

Maintenant, vous devriez être en mesure d'utiliser votre clavier n'importe où que vous pouvez taper dans Android.

complément d'étude

Le clavier ci-dessus est utilisable, mais de créer un clavier que d'autres personnes voudront utiliser, vous devrez probablement ajouter plus de fonctionnalités. Étudiez les liens ci-dessous pour apprendre comment.

En Cours

vous n'aimez pas l'apparence et le comportement de la norme KeyboardView ? Certainement pas. On dirait qu'il n'a pas été mis à jour depuis Android 2.0. Et tous ces claviers personnalisés dans le magasin de jeux? Ils n'ont rien à voir comme le laid clavier ci-dessus.

la bonne nouvelle est que vous pouvez complètement personnaliser l'apparence et le comportement de votre propre clavier. Vous devez faire les choses suivantes:

  1. créez votre propre vue clavier personnalisée que les sous-classes ViewGroup . Vous pouvez le remplir avec Button s ou même faire vos propres vues clés personnalisées que la sous-classe View . Si vous utilisez des vues popup, alors notez cette .
  2. Ajouter un personnalisé écouteur d'événement de l'interface de votre clavier. Appelez ses méthodes pour des choses comme onKeyClicked(String text) ou onBackspace() .
  3. vous n'avez pas besoin d'ajouter les keyboard_view.xml , key_preview.xml , ou number_pad.xml décrit dans les directions ci-dessus, car ils sont tous pour la norme KeyboardView . Vous gérerez tous ces aspects de L'interface utilisateur dans votre vue personnalisée.
  4. dans votre classe MyInputMethodService , mettre en œuvre la clavier auditeur que vous avez définis dans votre classe clavier. C'est à la place de KeyboardView.OnKeyboardActionListener , qui n'est plus nécessaire.
  5. dans votre méthode MyInputMethodService de classe onCreateInputView() , Créez et retournez une instance de votre clavier personnalisé. N'oubliez pas de régler l'écouteur personnalisé du clavier à this .
27
répondu Suragch 2018-04-09 05:34:19

voici un exemple de projet pour un clavier souple.

https://developer.android.com/guide/topics/text/creating-input-method.html

Votre devrait être dans les mêmes lignes avec une disposition différente.

Edit: Si vous n'avez besoin du clavier que dans votre application, c'est très simple! Créer une disposition linéaire avec orientation verticale, et créer 3 layouts linéaires à l'intérieur avec orientation horizontale. Puis placez les boutons de chaque rangée dans chacune de ces dispositions linéaires horizontales, et assignez la propriété de poids aux boutons. Utilisez android:layout_weight=1 pour chacun d'eux, de sorte qu'ils obtiennent également espacés.

cela résoudra le problème. Si vous n'avez pas obtenu ce qui était attendu, veuillez poster le code ici, et nous sommes là pour vous aider!

14
répondu nithinreddy 2014-03-06 22:32:52

In-App Keyboard

Cette réponse indique comment personnaliser un clavier à utiliser exclusivement dans votre application. Si vous voulez faire un clavier système qui peut être utilisé dans n'importe quelle application, alors voir mon autre réponse .

L'exemple ressemblera à ceci. Vous pouvez la modifier pour n'importe quel clavier.

enter image description here

1. Démarrer une nouveau projet Android

j'ai nommé mon projet InAppKeyboard . Appeler la vôtre tout ce que vous voulez.

2. Ajouter les fichiers de mise en page

disposition du Clavier

Ajouter un fichier de mise en page au dossier res/layout . J'ai appelé le mien keyboard . Le clavier sera un "compound view personnalisé que nous gonflerons à partir de ce fichier de mise en page xml. Vous pouvez utiliser la mise en page que vous voulez pour arranger les clés, mais j'utilise un LinearLayout . Notez le merge balises.

res/layout/keyboard.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/button_1"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="1"/>

            <Button
                android:id="@+id/button_2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="2"/>

            <Button
                android:id="@+id/button_3"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="3"/>

            <Button
                android:id="@+id/button_4"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="4"/>

            <Button
                android:id="@+id/button_5"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="5"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/button_6"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="6"/>

            <Button
                android:id="@+id/button_7"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="7"/>

            <Button
                android:id="@+id/button_8"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="8"/>

            <Button
                android:id="@+id/button_9"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="9"/>

            <Button
                android:id="@+id/button_0"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="0"/>

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <Button
                android:id="@+id/button_delete"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="2"
                android:text="Delete"/>

            <Button
                android:id="@+id/button_enter"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="3"
                android:text="Enter"/>

        </LinearLayout>
    </LinearLayout>

</merge>

Plan D'activité

à des fins de démonstration, notre activité a un seul EditText et le clavier est en bas. J'ai appelé ma vue clavier personnalisée MyKeyboard . (Nous allons ajouter ce code dans les meilleurs délais afin de les ignorer l'erreur pour l'instant.) L'avantage de mettre tout notre code clavier dans une vue unique est qu'il rend facile à réutiliser dans une autre activité ou application.

res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.inappkeyboard.MainActivity">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#c9c9f1"
        android:layout_margin="50dp"
        android:padding="5dp"
        android:layout_alignParentTop="true"/>

    <com.example.inappkeyboard.MyKeyboard
        android:id="@+id/keyboard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"/>

</RelativeLayout>

3. Ajouter le fichier Java

Ajouter un nouveau fichier Java. J'ai appelé le mien MyKeyboard .

la chose la plus importante à noter ici est qu'il n'y a aucun lien EditText ou Activity . Cela rend facile de le brancher dans n'importe quelle application ou activité qui en a besoin. Cette vue de clavier personnalisée utilise également un InputConnection , qui imite la façon dont un clavier système communique avec un EditText . C'est ainsi que nous évitons les liens étroits.

MyKeyboard est une vue composée qui gonfle la disposition de la vue que nous avons définie ci-dessus.

MyKeyboard.java

public class MyKeyboard extends LinearLayout implements View.OnClickListener {

    // constructors
    public MyKeyboard(Context context) {
        this(context, null, 0);
    }

    public MyKeyboard(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyKeyboard(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    // keyboard keys (buttons)
    private Button mButton1;
    private Button mButton2;
    private Button mButton3;
    private Button mButton4;
    private Button mButton5;
    private Button mButton6;
    private Button mButton7;
    private Button mButton8;
    private Button mButton9;
    private Button mButton0;
    private Button mButtonDelete;
    private Button mButtonEnter;

    // This will map the button resource id to the String value that we want to 
    // input when that button is clicked.
    SparseArray<String> keyValues = new SparseArray<>();

    // Our communication link to the EditText
    InputConnection inputConnection;

    private void init(Context context, AttributeSet attrs) {

        // initialize buttons
        LayoutInflater.from(context).inflate(R.layout.keyboard, this, true);
        mButton1 = (Button) findViewById(R.id.button_1);
        mButton2 = (Button) findViewById(R.id.button_2);
        mButton3 = (Button) findViewById(R.id.button_3);
        mButton4 = (Button) findViewById(R.id.button_4);
        mButton5 = (Button) findViewById(R.id.button_5);
        mButton6 = (Button) findViewById(R.id.button_6);
        mButton7 = (Button) findViewById(R.id.button_7);
        mButton8 = (Button) findViewById(R.id.button_8);
        mButton9 = (Button) findViewById(R.id.button_9);
        mButton0 = (Button) findViewById(R.id.button_0);
        mButtonDelete = (Button) findViewById(R.id.button_delete);
        mButtonEnter = (Button) findViewById(R.id.button_enter);

        // set button click listeners
        mButton1.setOnClickListener(this);
        mButton2.setOnClickListener(this);
        mButton3.setOnClickListener(this);
        mButton4.setOnClickListener(this);
        mButton5.setOnClickListener(this);
        mButton6.setOnClickListener(this);
        mButton7.setOnClickListener(this);
        mButton8.setOnClickListener(this);
        mButton9.setOnClickListener(this);
        mButton0.setOnClickListener(this);
        mButtonDelete.setOnClickListener(this);
        mButtonEnter.setOnClickListener(this);

        // map buttons IDs to input strings
        keyValues.put(R.id.button_1, "1");
        keyValues.put(R.id.button_2, "2");
        keyValues.put(R.id.button_3, "3");
        keyValues.put(R.id.button_4, "4");
        keyValues.put(R.id.button_5, "5");
        keyValues.put(R.id.button_6, "6");
        keyValues.put(R.id.button_7, "7");
        keyValues.put(R.id.button_8, "8");
        keyValues.put(R.id.button_9, "9");
        keyValues.put(R.id.button_0, "0");
        keyValues.put(R.id.button_enter, "\n");
    }

    @Override
    public void onClick(View v) {

        // do nothing if the InputConnection has not been set yet
        if (inputConnection == null) return;

        // Delete text or input key value
        // All communication goes through the InputConnection
        if (v.getId() == R.id.button_delete) {
            CharSequence selectedText = inputConnection.getSelectedText(0);
            if (TextUtils.isEmpty(selectedText)) {
                // no selection, so delete previous character
                inputConnection.deleteSurroundingText(1, 0);
            } else {
                // delete the selection
                inputConnection.commitText("", 1);
            }
        } else {
            String value = keyValues.get(v.getId());
            inputConnection.commitText(value, 1);
        }
    }

    // The activity (or some parent or controller) must give us 
    // a reference to the current EditText's InputConnection
    public void setInputConnection(InputConnection ic) {
        this.inputConnection = ic;
    }
}

4. Pointer le clavier sur le texte édité

pour Claviers système, Android utilise un InputMethodManager pour pointer le clavier vers le EditText focalisé . Dans cet exemple, l'activité prendra sa place en fournissant le lien du EditText à notre clavier personnalisé.

comme nous n'utilisons pas le clavier système, nous devons le désactiver pour l'empêcher de surgir lorsque nous touchons le EditText . Deuxièmement, nous devons obtenir le InputConnection du EditText et le donner à notre clavier.

activité principale.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = (EditText) findViewById(R.id.editText);
        MyKeyboard keyboard = (MyKeyboard) findViewById(R.id.keyboard);

        // prevent system keyboard from appearing when EditText is tapped
        editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
        editText.setTextIsSelectable(true);

        // pass the InputConnection from the EditText to the keyboard
        InputConnection ic = editText.onCreateInputConnection(new EditorInfo());
        keyboard.setInputConnection(ic);
    }
}

si votre activité comporte plusieurs textes D'édition, vous devez écrire le code pour passer le texte D'édition InputConnection au clavier. (Vous pouvez le faire en ajoutant un OnFocusChangeListener et OnClickListener aux textes D'édition. Voir cet article pour un la discussion de cette.) Vous pouvez également masquer ou afficher votre clavier au moment approprié.

fini

C'est ça. Vous devriez être en mesure d'exécuter l'application exemple maintenant et entrer ou supprimer du texte comme désiré. Votre prochaine étape est de tout modifier pour l'adapter à vos propres besoins. Par exemple, dans certains de mes claviers, j'ai utilisé TextViews plutôt que des boutons parce qu'il est plus facile de les personnaliser.

Notes

  • dans le fichier de mise en page xml, vous pouvez aussi utiliser un TextView plutôt qu'un Button si vous voulez améliorer l'apparence des clés. Ensuite, il suffit de faire que l'arrière-plan soit un dessin qui change l'état d'apparence lorsqu'il est pressé.
  • Advanced custom keyboards: pour plus de flexibilité dans l'apparence du clavier et la commutation du clavier, je fais maintenant des vues personnalisées des touches de la sous-classe View et des claviers personnalisés de la sous-classe ViewGroup . Le clavier présente tout les clés de la programmation. Les touches utilisent une interface pour communiquer avec le clavier (similaire à la façon dont les fragments communiquent avec une activité). Cela n'est pas nécessaire si vous n'avez besoin que d'une seule disposition de clavier puisque la disposition xml fonctionne très bien pour cela. Mais si vous voulez voir un exemple de ce que j'ai travaillé sur, consultez tous les Key* et Keyboard* classes ici . Notez que j'utilise aussi une vue de conteneur dont la fonction est d'échanger des claviers et à l'extérieur.
11
répondu Suragch 2018-02-07 16:28:54

un des exemples les mieux documentés que j'ai trouvé.

http://www.fampennings.nl/maarten/android/09keyboard/index.htm

KeyboardView le fichier XML et le code source connexes sont fournis.

6
répondu Youngjae 2014-02-09 08:30:05

Avait le même problème. J'ai utilisé la disposition de table au début mais la disposition a continué à changer après une pression de bouton. Trouvé cette page très utile. http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-creating-a-numeric-keypad-with-gridlayout/

1
répondu jeydee 2013-08-26 09:23:15

je suis tombé sur ce post récemment quand j'essayais de décider quelle méthode utiliser pour créer mon propre clavier personnalisé. J'ai trouvé l'API système Android très limitée, donc j'ai décidé de créer mon propre clavier in-app. En utilisant réponse de Suragch comme base de ma recherche, je suis allé à la conception mon propre composant de clavier . C'est posté sur GitHub avec une licence MIT. Espérons que cela sauvera quelqu'un d'autre beaucoup de temps et de maux de tête.

l'architecture est assez flexible. Il y a une vue principale (CustomKeyboardView) que vous pouvez injecter avec n'importe quelle disposition de clavier et contrôleur que vous voulez.

vous avez juste à déclarer le CustomKeyboardView Dans vous Activité xml (vous pouvez le faire programmatically aussi bien):

    <com.donbrody.customkeyboard.components.keyboard.CustomKeyboardView
    android:id="@+id/customKeyboardView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" />

enregistrez ensuite vos textes et dites-lui quel type de clavier ils doivent utiliser:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val numberField: EditText = findViewById(R.id.testNumberField)
    val numberDecimalField: EditText = findViewById(R.id.testNumberDecimalField)
    val qwertyField: EditText = findViewById(R.id.testQwertyField)

    keyboard = findViewById(R.id.customKeyboardView)
    keyboard.registerEditText(CustomKeyboardView.KeyboardType.NUMBER, numberField)
    keyboard.registerEditText(CustomKeyboardView.KeyboardType.NUMBER_DECIMAL, numberDecimalField)
    keyboard.registerEditText(CustomKeyboardView.KeyboardType.QWERTY, qwertyField)
}

le CustomKeyboardView s'occupe du reste!

j'ai la balle qui tourne avec un nombre, un nombre et un clavier QWERTY. N'hésitez pas à télécharger et créer vos propres mises en page et les contrôleurs. Il ressemble à ceci:

android custom keyboard gif landscape

enter image description here

Même si ce n'est pas l'architecture, vous décidez d'aller avec, espérons qu'il sera utile de voir le code source d'un travail in-app clavier.

encore une fois, voici le lien vers le projet: clavier In-App personnalisé

0
répondu Don Brody 2018-07-23 02:07:21