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.
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
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 .
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.
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. Le20%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 mettez0px
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. VoirkeyOutputText
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 unEditText
.
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.
- la Création d'une Méthode d'Entrée (Android documentation)
- SoftKeyboard (code source de Android pour une démo clavier personnalisé)
- construire un clavier Android personnalisé (tutoriel) ( code source )
- créer un clavier personnalisé sur Android (tutsplus tutorial)
- comment créer clavier personnalisé pour android (Vidéo YouTube: il est sans son, mais la suite est la façon dont je l'ai appris pour la première fois.)
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:
- créez votre propre vue clavier personnalisée que les sous-classes
ViewGroup
. Vous pouvez le remplir avecButton
s ou même faire vos propres vues clés personnalisées que la sous-classeView
. Si vous utilisez des vues popup, alors notez cette . - Ajouter un personnalisé écouteur d'événement de l'interface de votre clavier. Appelez ses méthodes pour des choses comme
onKeyClicked(String text)
ouonBackspace()
. - vous n'avez pas besoin d'ajouter les
keyboard_view.xml
,key_preview.xml
, ounumber_pad.xml
décrit dans les directions ci-dessus, car ils sont tous pour la normeKeyboardView
. Vous gérerez tous ces aspects de L'interface utilisateur dans votre vue personnalisée. - dans votre classe
MyInputMethodService
, mettre en œuvre la clavier auditeur que vous avez définis dans votre classe clavier. C'est à la place deKeyboardView.OnKeyboardActionListener
, qui n'est plus nécessaire. - dans votre méthode
MyInputMethodService
de classeonCreateInputView()
, Créez et retournez une instance de votre clavier personnalisé. N'oubliez pas de régler l'écouteur personnalisé du clavier àthis
.
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!
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.
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'unButton
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-classeViewGroup
. 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 lesKey*
etKeyboard*
classes ici . Notez que j'utilise aussi une vue de conteneur dont la fonction est d'échanger des claviers et à l'extérieur.
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.
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/
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:
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é