web-dev-qa-db-fra.com

Comment faire un clavier personnalisé Android?

Je veux faire un clavier personnalisé. Je ne sais pas comment le faire en XML et en activité. Cette image est mon modèle de clavier. Il suffit de chiffres.

enter image description here

72
XX_brother

Tout d’abord, vous aurez besoin d’un fichier keyboard.xml qui sera placé dans le dossier res/xml (si le dossier n’existe pas, créez-le).

<?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 la variable backspace et la placer dans le dossier res/drawable-ldpi avec une taille très petite (18x18 pixels, par exemple).

Ensuite, dans le fichier XML que vous souhaitez utiliser (où se trouve votre 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 allez placer le Android.inputmethodservice.KeyboardView doit obligatoirement être RelativeLayout pour pouvoir définir le alignParentBottom="true" (les claviers sont généralement 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 la TextView à laquelle vous voulez associer 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);

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

Ensuite, vous avez besoin de la fonction suivante pour ouvrir le clavier (vous devez l'associer à TextView via la propriété onClick 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 de la 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() {
    }
};

J'espère que cela pourra aider!!!

La plupart du code trouvé ici

69
Pontios

Utilisez 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 bonne chose à ce sujet est que R.xml.custom fait référence à /res/xml/custom.xml, qui définit en XML la disposition du clavier. Pour plus d'informations sur ce fichier, regardez ici: Keyboard , Keyboard.Row , Keyboard.Key .

30
bigstones

Clavier In-App

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

L'exemple ressemblera à ceci. Vous pouvez le modifier pour n'importe quelle disposition de clavier.

enter image description here

1. Démarrer un nouveau projet Android

J'ai nommé mon projet InAppKeyboard. Appelez le vôtre comme vous voulez.

2. Ajouter les fichiers de mise en page

Clavier

Ajoutez un fichier de mise en page dans le dossier res/layout. J'ai appelé le mien keyboard. Le clavier sera une vue composée personnalisée que nous allons gonfler à partir de ce fichier de présentation XML. Vous pouvez utiliser la disposition de votre choix pour organiser les touches, mais j'utilise une variable LinearLayout. Notez les balises merge .

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>

Mise en page de l'activité

À des fins de démonstration, notre activité a une seule variable EditText et le clavier est en bas. J'ai appelé ma vue de clavier personnalisée MyKeyboard. (Nous allons bientôt ajouter ce code, ignorez donc l'erreur pour l'instant.) L'avantage de mettre tout notre code clavier dans une seule vue est que cela facilite la réutilisation 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 du clavier

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

La chose la plus importante à noter ici est qu’il n’ya pas de lien réel entre EditText et Activity. Cela facilite son insertion dans toute 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 durs.

MyKeyboard est une vue composée qui gonfle la présentation 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. Pointez le clavier sur le texte d'édition

Pour les claviers système, Android utilise un InputMethodManager pour diriger le clavier sur la EditText focalisée. Dans cet exemple, l'activité prendra sa place en fournissant le lien de la EditText vers notre clavier personnalisé à.

Puisque nous n'utilisons pas le clavier système, nous devons le désactiver pour l'empêcher d'apparaître lorsque nous touchons la variable EditText. Deuxièmement, nous devons extraire la InputConnection de la EditText et la donner à notre clavier.

MainActivity.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 EditTexts, vous devrez écrire du code pour transmettre la valeur InputConnection de EditText de droite au clavier. (Vous pouvez le faire en ajoutant OnFocusChangeListener et OnClickListener aux EditTexts. Voir cet article pour une discussion à ce sujet.) Vous pouvez également vouloir masquer ou afficher votre clavier aux moments appropriés. 

Fini

C'est tout. Vous devriez être capable d'exécuter l'application d'exemple maintenant et de saisir ou supprimer du texte comme vous le souhaitez. Votre prochaine étape consiste à tout modifier pour répondre à vos propres besoins. Par exemple, dans certains de mes claviers, j'ai utilisé TextViews plutôt que des boutons car il est plus facile de les personnaliser.

Remarques

  • Dans le fichier de mise en page XML, vous pouvez également utiliser TextView plutôt que Button si vous voulez améliorer l'apparence des clés. Ensuite, il suffit de faire de l’arrière-plan un dessin qui modifie l’apparence lorsque vous appuyez dessus.
  • Claviers personnalisés avancés: pour plus de souplesse dans l'apparence et le changement de clavier, je crée maintenant des vues de clé personnalisées de la sous-classe View et des claviers personnalisés de la sous-classe ViewGroup. Le clavier dispose de toutes les touches par programme. Les touches utilisent une interface pour communiquer avec le clavier (de la même manière que les fragments communiquent avec une activité). Cela n'est pas nécessaire si vous n'avez besoin que d'une seule disposition de clavier, car la disposition xml fonctionne bien pour cela. Mais si vous voulez voir un exemple de ce sur quoi je travaille, consultez toutes les classes Key* et Keyboard*ici . Notez que j'utilise également une vue conteneur qui a pour fonction d'échanger les claviers.
19
Suragch

Voici un exemple de projet pour un clavier logiciel.

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

Votre devrait être dans les mêmes lignes avec une mise en page différente.

Édition: Si vous avez besoin du clavier uniquement dans votre application, sa procédure est très simple! Créez une présentation linéaire avec une orientation verticale et créez-y 3 dispositions linéaires en orientation horizontale rangée dans chacune de ces dispositions linéaires horizontales et affectez la propriété weight aux boutons. Utilisez Android: layout_weight = 1 pour tous, afin qu'ils soient espacés de manière égale.

Cela va résoudre. Si vous n’avez pas obtenu ce qui était attendu, merci de poster le code ici, et nous sommes là pour vous aider!

14
nithinreddy

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

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

Un fichier XML et le code source liés à KeyboardView sont fournis.

6
Youngjae

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

1
jeydee

Je suis tombé sur ce message récemment lorsque j'essayais de décider de la méthode à utiliser pour créer mon propre clavier personnalisé. L’API du système Android étant très limitée, j’ai donc décidé de créer mon propre clavier intégré à l’application. En utilisant La réponse de Suragch comme base de mes recherches, j'ai ensuite conçu mon propre composant de clavier . Il est publié sur GitHub avec une licence MIT. Espérons que cela fera économiser beaucoup de temps et de maux de tête à quelqu'un d'autre.

L'architecture est assez flexible. Il existe une vue principale (CustomKeyboardView) que vous pouvez injecter avec la configuration de clavier et le contrôleur de votre choix. 

Vous devez simplement déclarer CustomKeyboardView dans votre activité xml (vous pouvez également le faire par programme):

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

Puis enregistrez votre EditText avec 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 gère le reste!

J'ai le ballon qui roule avec un clavier Number, NumberDecimal et QWERTY. N'hésitez pas à le télécharger et à créer vos propres dispositions et contrôleurs. Cela ressemble à ceci:

Android custom keyboard gif landscape

enter image description here

Même si ce n’est pas l’architecture que vous choisissez, il serait utile de voir le code source d’un clavier intégré à l’application.

Encore une fois, voici le lien vers le projet: Clavier In-App personnalisé

1
Don Brody

Eh bien, Suragch a donné la meilleure réponse jusqu'à présent, mais il a omis certains éléments mineurs importants pour la compilation de l'application.

J'espère faire une meilleure réponse que Suragch en améliorant sa réponse. Je vais ajouter tous les éléments manquants qu'il n'a pas mis.

J'ai compilé mon apk à l'aide de l'application Android, APK Builder 1.1.0. Alors commençons.

Pour créer une application Android, nous avons besoin de deux fichiers et dossiers organisés dans un certain format et capitalisés en conséquence.

res layout -> fichiers XML décrivant l’apparence de l’application sur le téléphone. Semblable à la façon dont le HTML définit l'apparence d'une page Web dans un navigateur. Permettre à votre application de tenir sur les écrans en conséquence.

valeurs -> données constantes telles que colors.xml, strings.xml, styles.xml. Ces fichiers doivent être correctement orthographiés.

drawable -> photos {jpeg, png, ...}; Nommez-les n'importe quoi.

mipmap -> plus de photos. utilisé pour l'icône de l'application?

xml -> plus de fichiers xml.

src -> agit comme JavaScript en HTML. Les fichiers de mise en page initieront la vue de départ et votre fichier Java contrôlera de manière dynamique les éléments de balise et les événements déclencheurs. Les événements peuvent également être activés directement dans le fichier layout.xml, tout comme en HTML.

AndroidManifest.xml -> Ce fichier enregistre le contenu de votre application. Nom de l'application, type de programme, autorisations nécessaires, etc. Cela semble rendre Android plutôt sûr. Les programmes ne peuvent littéralement pas faire ce qu'ils n'ont pas demandé dans le manifeste.

Il existe maintenant 4 types de programmes Android, une activité, un service, un fournisseur de contenu et un récepteur de diffusion. Notre clavier sera un service, ce qui lui permet de fonctionner en arrière-plan. Il n'apparaîtra pas dans la liste des applications à lancer. mais il peut être désinstallé.

Pour compiler votre application, vous devez signer et signer graduellement. Vous pouvez rechercher celui-ci ou utiliser APK Builder pour Android. C'est super facile.

Maintenant que nous comprenons le développement de Android, laissez-nous créer les fichiers et les dossiers.

  1. Créez les fichiers et les dossiers comme indiqué ci-dessus. Mon répertoire sera comme suit:

    • NumPad
      • AndroidManifest.xml
      • src
        • Saragch
          • pavé numérique
            • MyInputMethodService.Java
      • res
        • tirable
          • Suragch_NumPad_icon.png
        • disposition
          • key_preview.xml
          • keyboard_view.xml
        • xml
          • method.xml
          • number_pad.xml
        • valeurs
          • couleurs.xml
          • strings.xml
          • styles.xml

N'oubliez pas que si vous utilisez un logiciel tel que Android Studio, il peut contenir un fichier de projet.

  1. Écrire des fichiers.

A: NumPad/res/layout/key_preview.xml

<?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>

B: Pavé Numérique/res/layout/keyboard_view.xml

<?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>

C: NumPad/res/xml/method.xml

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

D: pavé numérique/res/xml/number_pad.xml

<?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>

Bien sûr, cela peut être facilement édité à votre goût. Vous pouvez même utiliser des images à la place de mots pour l’étiquette.

Suragch n'a pas démontré les fichiers dans le dossier de valeurs et a supposé que nous avions accès à Android Studio; qui les crée automatiquement. C'est une bonne chose que j'ai APK Builder.

E: NumPad/res/values ​​/ colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
</resources>

F: NumPad/res/values ​​/ strings.xml

<resources>
    <string name="app_name">Suragch NumPad</string>
</resources>

G: NumPad/res/values ​​/ styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Android:Theme.Material.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>

H: Pavé Numérique/AndroidManifest.xml

C'est le fichier qui était vraiment prêt pour la contension. Ici, je sentais que je ne compilerais jamais mon programme. sanglot. sanglot. Si vous vérifiez la réponse de Suracgh, vous verrez qu'il laisse le premier ensemble de champs vide et ajoute la balise d'activité dans ce fichier. Comme je l'ai dit, il existe quatre types de programmes Android. Une activité est une application régulière avec une icône de lanceur. Ce pavé numérique n'est pas une activité! En outre, il n'a mis en œuvre aucune activité.

Mes amis n'incluent pas la balise d'activité. Votre programme se compilera et, lorsque vous essayez de le lancer, il plantera! En ce qui concerne xmlns: Android et uses-sdk; Je ne peux pas vous aider là-bas. Essayez juste mes réglages s'ils fonctionnent.

Comme vous pouvez le constater, il existe un numéro de service qui l’enregistre en tant que service. De plus, service.Android:name doit être le nom du service d'extension de classe publique dans notre fichier Java. Il DOIT être capitalisé en conséquence. Package est également le nom du package que nous avons déclaré dans le fichier Java.

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="Saragch.num_pad">

    <uses-sdk
        Android:minSdkVersion="12"
        Android:targetSdkVersion="27" />

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/Suragch_NumPad_icon"
        Android:label="@string/app_name"
        Android:supportsRtl="true"
        Android:theme="@style/AppTheme">

        <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>

I: pavé numérique/src/Saragch/pavé numérique/MyInputMethodService.Java

Note: Je pense que Java est une alternative à src.

C'était un autre fichier de problème, mais pas aussi controversé que le fichier manifeste. Comme je le sais bien Java assez bon pour savoir ce qui est quoi, ce qui ne l’est pas. Je connais à peine xml et ses liens avec Android développement!

Le problème ici est qu'il n'a rien importé! Je veux dire, il nous a donné un fichier "complet" qui utilise des noms qui ne pourraient pas être résolus! InputMethodService, Keyboard, etc. C'est une mauvaise pratique, M. Suragch. Merci de m'avoir aidé, mais comment vous attendiez-vous à ce que le code soit compilé si les noms ne peuvent pas être résolus?

Voici la version correctement modifiée. Il m'est arrivé de jongler avec quelques allusions pour me conduire au bon endroit pour savoir quoi importer exactement.

package Saragch.num_pad;

import Android.inputmethodservice.InputMethodService;
import Android.inputmethodservice.KeyboardView;
import Android.inputmethodservice.Keyboard;

import Android.text.TextUtils;
import Android.view.inputmethod.InputConnection;

import Android.content.Context;
import Android.content.Intent;
import Android.content.pm.PackageManager;
import Android.os.Build;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.ImageView;
import Android.widget.TextView;
import Android.widget.Toast;


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() { }
}
  1. Compilez et signez votre projet.

    C’est là que je suis désemparé en tant que nouveau développeur Android. Je voudrais l’apprendre manuellement, car j’estime que les vrais programmeurs peuvent compiler manuellement.

Je pense que Gradle est l’un des outils de compilation et d’emballage d’APK. apk semble être comme un fichier jar ou un fichier rar pour le fichier Zip. Il existe alors deux types de signature. clé de débogage qui n'est pas autorisée sur Play Store et clé privée.

Eh bien, donnons un coup de main à M. Saragch. Et merci d'avoir regardé ma vidéo. Comme, abonnez-vous.

0