Wie können Sie eine benutzerdefinierte Tastatur in Android erstellen?
105
Ich möchte eine benutzerdefinierte Tastatur erstellen. Ich weiß nicht, wie es mit XML und Java geht. Das folgende Bild ist ein Modell der Tastatur, die ich erstellen möchte. Es braucht nur Zahlen.
** Beachten Sie, dass Sie das backspaceZeichenelement erstellen und mit einer sehr kleinen Größe (z. B. 18 x 18 Pixel) im Ordner res / drawable-ldpi ablegen müssen.
Dann sollten Sie in der XML-Datei, in der sie verwendet werden soll (wo sich Ihre TextView befindet), den folgenden Code hinzufügen:
** Beachten Sie, dass die XML-Datei, in die Sie die Datei einfügen android.inputmethodservice.KeyboardView, vorhanden sein muss, um die Datei RelativeLayoutfestlegen zu könnenalignParentBottom="true" die Tastatur vornehmen (normalerweise werden die Tastaturen am unteren Bildschirmrand angezeigt).
Anschließend müssen Sie den folgenden Code in die onCreateFunktion einfügen Activity, mit der TextViewSie die Tastatur anbringen möchten
// Create the Keyboard
mKeyboard=newKeyboard(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);
** Beachten Sie, dass mKeyboardund mKeyboardViewprivate Klassenvariablen sind, die Sie erstellen müssen.
Dann benötigen Sie die folgende Funktion zum Öffnen der Tastatur (Sie müssen sie über die onClickxml-Eigenschaft mit TextView verknüpfen ).
Und schließlich brauchen Sie das OnKeyboardActionListener, was Ihre Ereignisse behandelt
privateOnKeyboardActionListener mOnKeyboardActionListener =newOnKeyboardActionListener(){@Overridepublicvoid onKey(int primaryCode,int[] keyCodes){//Here check the primaryCode to see which key is pressed //based on the android:codes propertyif(primaryCode==1){Log.i("Key","You just pressed 1 button");}}@Overridepublicvoid onPress(int arg0){}@Overridepublicvoid onRelease(int primaryCode){}@Overridepublicvoid onText(CharSequence text){}@Overridepublicvoid swipeDown(){}@Overridepublicvoid swipeLeft(){}@Overridepublicvoid swipeRight(){}@Overridepublicvoid swipeUp(){}};
Was ist, wenn die Tastatur nicht am unteren Bildschirmrand angezeigt werden soll? (zB möchte ich, dass der Benutzer es ziehen kann). Kann ich das über meine Tastatur-App steuern oder wird es vom Android-System verwaltet?
user3294126
Die Tastaturbreite füllt den Bildschirm nicht aus. Was soll ich tun, damit er alle Bildschirme ausfüllt?
George Thomas
In welchem übergeordneten Layout befindet sich die Tastaturansicht? Haben Sie auch die layout_width der KeyboardView überprüft?
Pontios
1
Bitte beachten Sie, dass die KeyboardView- und Keyboard-Klassen seit API-Level 29 von Google nicht mehr unterstützt werden. Daher funktioniert diese Lösung in Zukunft nicht mehr, wenn Sie auf ein neueres API-Level abzielen müssen.
Maex
keyboardView wird von Google nicht mehr unterstützt. Was ist eine neue Lösung?
tohidmahmoudvand
78
Systemtastatur
In dieser Antwort erfahren Sie, wie Sie eine benutzerdefinierte Systemtastatur erstellen, die in jeder App verwendet werden kann, die ein Benutzer auf seinem Telefon installiert hat. Wenn Sie eine Tastatur erstellen möchten, die nur in Ihrer eigenen App verwendet wird, lesen Sie meine andere Antwort .
Das folgende Beispiel sieht folgendermaßen aus. Sie können es für jedes Tastaturlayout ändern.
Die folgenden Schritte zeigen, wie Sie eine funktionierende benutzerdefinierte Systemtastatur erstellen. So viel wie möglich habe ich versucht, unnötigen Code zu entfernen. Wenn Sie weitere Funktionen benötigen, habe ich am Ende Links zu weiterer Hilfe bereitgestellt.
1. Starten Sie ein neues Android-Projekt
Ich habe mein Projekt "Custom Keyboard" genannt. Nennen Sie es wie Sie wollen. Hier gibt es nichts Besonderes. Ich werde einfach die MainActivityund "Hallo Welt!" Layout wie es ist.
2. Fügen Sie die Layoutdateien hinzu
Fügen Sie dem res/layoutOrdner Ihrer App die folgenden zwei Dateien hinzu:
keyboard_view.xml
key_preview.xml
keyboard_view.xml
Diese Ansicht ist wie ein Container, der unsere Tastatur enthält. In diesem Beispiel gibt es nur eine Tastatur, aber Sie können auch andere Tastaturen hinzufügen und diese ein- und austauschen KeyboardView.
Die Tastenvorschau ist ein Layout, das beim Drücken einer Tastaturtaste angezeigt wird. Es zeigt nur, welche Taste Sie drücken (falls Ihre großen, fetten Finger sie bedecken). Dies ist kein Multiple-Choice-Popup. Schauen Sie sich dazu die Kandidatenansicht an .
Erstellen Sie einen xmlOrdner in Ihrem resOrdner. (Klicken Sie mit der rechten Maustaste resund wählen Sie Neu> Verzeichnis .)
Fügen Sie dann die folgenden zwei XML-Dateien hinzu. (Klicken Sie mit der rechten Maustaste auf den xmlOrdner und wählen Sie Neu> XML-Ressourcendatei .)
number_pad.xml
method.xml
number_pad.xml
Hier wird es immer interessanter. Dies Keyboarddefiniert das Layout der Tasten .
keyWidth: Dies ist die Standardbreite jedes Schlüssels. Die 20%pbedeutet , dass jeder Schlüssel sollte 20% der Breite des einnehmen p Arent. Es kann jedoch von einzelnen Tasten überschrieben werden, wie Sie mit den Tasten Löschen und Eingeben in der dritten Zeile sehen können.
keyHeight: Es ist hier fest codiert, aber Sie können es verwenden @dimen/key_height, um es dynamisch für verschiedene Bildschirmgrößen einzustellen.
Gap: Die horizontale und vertikale Lücke gibt an, wie viel Platz zwischen den Tasten verbleibt. Auch wenn Sie es einstellen, 0pxgibt es immer noch eine kleine Lücke.
codes: Dies kann ein Unicode- oder benutzerdefinierter Codewert sein, der bestimmt, was passiert oder was eingegeben wird, wenn die Taste gedrückt wird. Überprüfen keyOutputTextSie, ob Sie eine längere Unicode-Zeichenfolge eingeben möchten.
keyLabel: Dies ist der Text, der auf der Taste angezeigt wird.
keyEdgeFlags: Dies gibt an, an welcher Kante der Schlüssel ausgerichtet werden soll.
isRepeatable: Wenn Sie die Taste gedrückt halten, wird die Eingabe wiederholt.
method.xml
Diese Datei teilt dem System die verfügbaren Untertypen der Eingabemethode mit. Ich füge hier nur eine Minimalversion hinzu.
4. Fügen Sie den Java-Code hinzu, um die Schlüsseleingabe zu verarbeiten
Erstellen Sie eine neue Java-Datei. Nennen wir es MyInputMethodService. Diese Datei verbindet alles miteinander. Es verarbeitet die von der Tastatur empfangenen Eingaben und sendet sie an die Ansicht weiter, die sie empfängt ( EditTextz. B.).
publicclassMyInputMethodServiceextendsInputMethodServiceimplementsKeyboardView.OnKeyboardActionListener{@OverridepublicView onCreateInputView(){// get the KeyboardView and add our Keyboard layout to itKeyboardView keyboardView =(KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view,null);Keyboard keyboard =newKeyboard(this, R.xml.number_pad);
keyboardView.setKeyboard(keyboard);
keyboardView.setOnKeyboardActionListener(this);return keyboardView;}@Overridepublicvoid onKey(int primaryCode,int[] keyCodes){InputConnection ic = getCurrentInputConnection();if(ic ==null)return;switch(primaryCode){caseKeyboard.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);}break;default:char code =(char) primaryCode;
ic.commitText(String.valueOf(code),1);}}@Overridepublicvoid onPress(int primaryCode){}@Overridepublicvoid onRelease(int primaryCode){}@Overridepublicvoid onText(CharSequence text){}@Overridepublicvoid swipeLeft(){}@Overridepublicvoid swipeRight(){}@Overridepublicvoid swipeDown(){}@Overridepublicvoid swipeUp(){}}
Anmerkungen:
Das OnKeyboardActionListenerwartet auf Tastatureingaben. In diesem Beispiel sind auch alle diese leeren Methoden erforderlich.
Das InputConnectionist das, was verwendet wird , Eingabe in einer anderen Ansicht wie ein zu senden EditText.
5. Aktualisieren Sie das Manifest
Ich habe dies eher als letztes als als erstes gesetzt, da es sich auf die Dateien bezieht, die wir bereits oben hinzugefügt haben. Um Ihre benutzerdefinierte Tastatur als Systemtastatur zu registrieren, müssen serviceSie Ihrer Datei AndroidManifest.xml einen Abschnitt hinzufügen . Setzen Sie es in den applicationAbschnitt nach activity.
Das ist es! Sie sollten Ihre App jetzt ausführen können. Sie werden jedoch nicht viel sehen, bis Sie Ihre Tastatur in den Einstellungen aktivieren.
6. Aktivieren Sie die Tastatur in den Einstellungen
Jeder Benutzer, der Ihre Tastatur verwenden möchte, muss sie in den Android-Einstellungen aktivieren. Ausführliche Anweisungen dazu finden Sie unter folgendem Link:
Gehen Sie zu Android-Einstellungen> Sprachen und Eingabe> Aktuelle Tastatur> Tastaturen auswählen.
Sie sollten Ihre benutzerdefinierte Tastatur in der Liste sehen. Aktivieren Sie es.
Gehen Sie zurück und wählen Sie erneut Aktuelle Tastatur. Sie sollten Ihre benutzerdefinierte Tastatur in der Liste sehen. Wählen Sie.
Jetzt sollten Sie Ihre Tastatur überall dort verwenden können, wo Sie Android eingeben können.
Weitere Studie
Die obige Tastatur ist verwendbar, aber um eine Tastatur zu erstellen, die andere Benutzer verwenden möchten, müssen Sie wahrscheinlich weitere Funktionen hinzufügen. Lesen Sie die folgenden Links, um zu erfahren, wie.
Gefällt dir nicht, wie der Standard KeyboardViewaussieht und sich verhält? Ich sicherlich nicht. Es sieht so aus, als ob es seit Android 2.0 nicht mehr aktualisiert wurde. Wie wäre es mit all diesen benutzerdefinierten Tastaturen im Play Store? Sie sehen nicht wie die hässliche Tastatur oben aus.
Die gute Nachricht ist, dass Sie das Aussehen und Verhalten Ihrer eigenen Tastatur vollständig anpassen können. Sie müssen die folgenden Dinge tun:
Erstellen Sie Ihre eigene benutzerdefinierte Tastaturansicht, die Unterklassen enthält ViewGroup. Sie können es mit Buttons füllen oder sogar Ihre eigenen benutzerdefinierten Schlüsselansichten für diese Unterklasse erstellen View. Wenn Sie Popup-Ansichten verwenden, beachten Sie dies .
Fügen Sie Ihrer Tastatur eine benutzerdefinierte Ereignis-Listener- Oberfläche hinzu. Nennen Sie seine Methoden für Dinge wie onKeyClicked(String text)oder onBackspace().
Sie haben nicht die hinzugefügt werden muss keyboard_view.xml, key_preview.xmloder number_pad.xmlbeschrieben in den Richtungen oben , da diese alle für den Standard KeyboardView. Sie werden alle diese UI-Aspekte in Ihrer benutzerdefinierten Ansicht behandeln.
In Ihrer MyInputMethodServiceKlasse implementieren die benutzerdefinierte Tastatur Hörer , dass Sie in Ihrer Tastatur - Klasse definiert. Dies ist anstelle von KeyboardView.OnKeyboardActionListener, was nicht mehr benötigt wird.
Erstellen Sie in MyInputMethodServiceder onCreateInputView()Methode Ihrer Klasse eine Instanz Ihrer benutzerdefinierten Tastatur und geben Sie sie zurück. Vergessen Sie nicht, den benutzerdefinierten Listener der Tastatur auf einzustellen this.
In dieser Antwort erfahren Sie, wie Sie eine benutzerdefinierte Tastatur erstellen, die ausschließlich in Ihrer App verwendet wird. Wenn Sie eine Systemtastatur erstellen möchten, die in jeder App verwendet werden kann, lesen Sie meine andere Antwort .
Das Beispiel wird so aussehen. Sie können es für jedes Tastaturlayout ändern.
1. Starten Sie ein neues Android-Projekt
Ich habe mein Projekt benannt InAppKeyboard. Rufen Sie Ihre an, wie Sie wollen.
2. Fügen Sie die Layoutdateien hinzu
Tastaturbelegung
Fügen Sie dem res/layoutOrdner eine Layoutdatei hinzu. Ich habe meine angerufen keyboard. Die Tastatur ist eine benutzerdefinierte zusammengesetzte Ansicht , die wir aus dieser XML-Layoutdatei aufblasen. Sie können ein beliebiges Layout verwenden, um die Tasten anzuordnen, aber ich verwende ein LinearLayout. Beachten Sie die mergeTags.
Zu Demonstrationszwecken hat unsere Aktivität eine einzige EditTextund die Tastatur befindet sich unten. Ich habe meine benutzerdefinierte Tastaturansicht aufgerufen MyKeyboard. (Wir werden diesen Code bald hinzufügen, ignorieren Sie den Fehler also vorerst.) Der Vorteil, wenn Sie unseren gesamten Tastaturcode in einer einzigen Ansicht zusammenfassen, besteht darin, dass die Wiederverwendung in einer anderen Aktivität oder App vereinfacht wird.
Fügen Sie eine neue Java-Datei hinzu. Ich habe meine angerufen MyKeyboard.
Das Wichtigste dabei ist, dass es keine feste Verbindung zu einem EditTextoder gibt Activity. Dies macht es einfach, es an jede App oder Aktivität anzuschließen, die es benötigt. Diese benutzerdefinierte Tastaturansicht verwendet auch eine InputConnection, die die Art und Weise nachahmt, wie eine Systemtastatur mit einer kommuniziert EditText. So vermeiden wir die harten Verbindungen.
MyKeyboard ist eine zusammengesetzte Ansicht, die das oben definierte Ansichtslayout aufbläst.
MyKeyboard.java
publicclassMyKeyboardextendsLinearLayoutimplementsView.OnClickListener{// constructorspublicMyKeyboard(Context context){this(context,null,0);}publicMyKeyboard(Context context,AttributeSet attrs){this(context, attrs,0);}publicMyKeyboard(Context context,AttributeSet attrs,int defStyleAttr){super(context, attrs, defStyleAttr);
init(context, attrs);}// keyboard keys (buttons)privateButton mButton1;privateButton mButton2;privateButton mButton3;privateButton mButton4;privateButton mButton5;privateButton mButton6;privateButton mButton7;privateButton mButton8;privateButton mButton9;privateButton mButton0;privateButton mButtonDelete;privateButton 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 =newSparseArray<>();// Our communication link to the EditTextInputConnection inputConnection;privatevoid init(Context context,AttributeSet attrs){// initialize buttonsLayoutInflater.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");}@Overridepublicvoid onClick(View v){// do nothing if the InputConnection has not been set yetif(inputConnection ==null)return;// Delete text or input key value// All communication goes through the InputConnectionif(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{Stringvalue= 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 InputConnectionpublicvoid setInputConnection(InputConnection ic){this.inputConnection = ic;}}
4. Zeigen Sie mit der Tastatur auf den EditText
Bei Systemtastaturen verwendet Android einen InputMethodManager , um die Tastatur auf den Fokus zu richtenEditText . In diesem Beispiel wird die Aktivität an ihre Stelle treten, indem der Link von EditTextzu unserer benutzerdefinierten Tastatur zu bereitgestellt wird .
Da wir die Systemtastatur nicht verwenden, müssen wir sie deaktivieren, damit sie beim Berühren der nicht auftaucht EditText. Zweitens müssen wir das InputConnectionvon der bekommen EditTextund es unserer Tastatur geben.
MainActivity.java
publicclassMainActivityextendsAppCompatActivity{@Overrideprotectedvoid 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 keyboardInputConnection ic = editText.onCreateInputConnection(newEditorInfo());
keyboard.setInputConnection(ic);}}
Wenn Ihre Aktivität mehrere EditTexts enthält, müssen Sie Code schreiben, um die richtigen EditText-Dateien InputConnectionan die Tastatur zu übergeben. (Sie können dies tun, indem Sie ein OnFocusChangeListenerund OnClickListenerzu den EditTexts hinzufügen. Weitere Informationen hierzu finden Sie in diesem Artikel .) Möglicherweise möchten Sie Ihre Tastatur auch zu geeigneten Zeiten ausblenden oder anzeigen .
Fertig
Das ist es. Sie sollten jetzt in der Lage sein, die Beispiel-App auszuführen und Text wie gewünscht einzugeben oder zu löschen. Ihr nächster Schritt besteht darin, alles an Ihre eigenen Bedürfnisse anzupassen. In einigen meiner Tastaturen habe ich beispielsweise TextViews anstelle von Schaltflächen verwendet, da es einfacher ist, sie anzupassen.
Anmerkungen
In der XML-Layoutdatei können Sie auch ein TextViewa verwenden, Buttonwenn die Schlüssel besser aussehen sollen. Machen Sie dann einfach den Hintergrund zu einem Zeichenobjekt, das den Status des Erscheinungsbilds beim Drücken ändert.
Erweiterte benutzerdefinierte Tastaturen: Für mehr Flexibilität beim Erscheinungsbild der Tastatur und beim Umschalten der Tastatur erstelle ich jetzt benutzerdefinierte Tastenansichten für Unterklassen Viewund benutzerdefinierte Tastaturen für Unterklassen ViewGroup. Die Tastatur legt alle Tasten programmgesteuert an. Die Tasten verwenden eine Schnittstelle zur Kommunikation mit der Tastatur (ähnlich wie Fragmente mit einer Aktivität kommunizieren). Dies ist nicht erforderlich, wenn Sie nur ein einziges Tastaturlayout benötigen, da das XML-Layout dafür einwandfrei funktioniert. Aber wenn Sie ein Beispiel sehen wollen , was ich gearbeitet haben, überprüfen Sie alle Key*und Keyboard*Klassen hier . Beachten Sie, dass ich dort auch eine Containeransicht verwende, deren Funktion es ist, Tastaturen ein- und auszutauschen.
Ihre Antwort ist großartig, aber wie können wir zwischen einer Originaltastatur und dieser neuen Tastatur wechseln?
Kishan Donga
@KishanDonga, Auf Ihrer Tastatur können Sie eine Taste zum Wechseln der Tastatur hinzufügen. Wenn der Benutzer drückt, rufen Sie an InputMethodManager#showInputMethodPicker(). Wenn die ursprüngliche Tastatur jedoch nicht über eine solche Taste verfügt, können Benutzer nur manuell in den Systemeinstellungen zu Ihrer Tastatur wechseln. Apple ist Android in diesem Bereich überlegen, da Apple für alle Tastaturen eine Tastaturumschalttaste benötigt.
Suragch
@KishanDonga, ich habe gerade festgestellt, dass es sich bei dieser Antwort um eine In-App-Tastatur handelt, nicht um die Systemtastatur. Wenn Sie zwischen zwei benutzerdefinierten Tastaturen wechseln möchten, können Sie diese programmgesteuert in eine Containeransicht ein- und auswechseln. Fügen Sie einfach eine Tastaturtausch-Taste auf beiden Tastaturen hinzu. Siehe meine Anmerkung und den Link "Erweiterte benutzerdefinierte Tastaturen" in der obigen Antwort.
Suragch
Wenn Sie zwischen Ihrer Tastatur und der Systemtastatur wechseln möchten, blenden Sie die Systemtastatur aus und zeigen Sie Ihre Tastatur zu den entsprechenden Zeiten an (und umgekehrt).
Suragch
1
@MarekTakac, Sie müssen die Systemtastatur deaktivieren und bei jeder Aktivität Ihre benutzerdefinierte Tastatur hinzufügen. Wenn eine Aktivität mehrere EditTexts hat, müssen Sie ihnen eine hinzufügen onFocusChangedListener, damit Sie, wenn sie den Fokus erhalten, die InputConnectionvon der aktuellen EditTextzu Ihrer benutzerdefinierten Tastatur zuweisen können .
Das Schöne daran ist, dass es R.xml.customsich um /res/xml/custom.xmldas Layout der Tastatur handelt, das in XML definiert. Weitere Informationen zu dieser Datei finden Sie hier: Tastatur , Keyboard.Row , Keyboard.Key .
Ihre sollten in den gleichen Zeilen mit einem anderen Layout sein.
Bearbeiten: Wenn Sie die Tastatur nur in Ihrer Anwendung benötigen, ist es sehr einfach! Erstellen Sie ein lineares Layout mit vertikaler Ausrichtung und erstellen Sie darin 3 lineare Layouts mit horizontaler Ausrichtung. Platzieren Sie dann die Schaltflächen jeder Zeile in jedem dieser horizontalen linearen Layouts und weisen Sie den Schaltflächen die Eigenschaft weight zu. Verwenden Sie android: layout_weight = 1 für alle, damit sie gleich weit voneinander entfernt sind.
Dies wird lösen. Wenn Sie nicht das bekommen haben, was erwartet wurde, posten Sie bitte den Code hier und wir sind hier, um Ihnen zu helfen!
Die Bearbeitung ist tatsächlich schlecht, da dies bedeuten würde, dass die Tastatur immer angezeigt wird und sich nicht wie eine Standard-Android-Tastatur verhält.
m0skit0
6
Eines der am besten dokumentierten Beispiele, die ich gefunden habe.
Ich bin kürzlich auf diesen Beitrag gestoßen, als ich versucht habe zu entscheiden, mit welcher Methode ich meine eigene benutzerdefinierte Tastatur erstellen möchte. Ich fand die Android-System-API sehr eingeschränkt und entschied mich daher, meine eigene In-App-Tastatur zu erstellen. Mit Suragch Antwort als Grundlage für meine Forschung, ging ich auf entwerfen meine eigene Tastatur Komponente . Es ist auf GitHub mit einer MIT-Lizenz veröffentlicht. Hoffentlich spart dies jemand anderem viel Zeit und Kopfschmerzen.
Die Architektur ist ziemlich flexibel. Es gibt eine Hauptansicht (CustomKeyboardView), die Sie mit jedem gewünschten Tastaturlayout und Controller einfügen können.
Sie müssen nur die CustomKeyboardView in Ihrer Aktivitäts-XML deklarieren (Sie können dies auch programmgesteuert tun):
Registrieren Sie dann Ihre EditText-Dateien und teilen Sie ihr mit, welche Art von Tastatur sie verwenden sollen:
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)}
Das CustomKeyboardView erledigt den Rest!
Ich habe den Ball mit einer Number-, NumberDecimal- und QWERTZ-Tastatur ins Rollen gebracht. Laden Sie es herunter und erstellen Sie Ihre eigenen Layouts und Controller. Es sieht aus wie das:
Auch wenn dies nicht die Architektur ist, für die Sie sich entscheiden, ist es hoffentlich hilfreich, den Quellcode für eine funktionierende In-App-Tastatur anzuzeigen.
Nun, Suragch gab bisher die beste Antwort, aber er übersprang einige kleinere Dinge, die für die Kompilierung der App wichtig waren.
Ich hoffe, eine bessere Antwort als Suragch zu geben, indem ich seine Antwort verbessere. Ich werde alle fehlenden Elemente hinzufügen, die er nicht gesetzt hat.
Ich habe meine apk mit der android app APK Builder 1.1.0 kompiliert. Also fangen wir an.
Um eine Android-App zu erstellen, benötigen wir einige Dateien und Ordner, die in einem bestimmten Format organisiert und entsprechend groß geschrieben sind.
res layout -> xml-Dateien, die zeigen, wie die App auf dem Telefon aussehen wird. Ähnlich wie HTML das Aussehen der Webseite im Browser beeinflusst. Ermöglichen, dass Ihre App entsprechend auf Bildschirme passt.
Werte -> konstante Daten wie Farben.xml, Zeichenfolgen.xml, Stile.xml. Diese Dateien müssen richtig geschrieben sein.
zeichnbar -> Bilder {jpeg, png, ...}; Nennen Sie sie irgendetwas.
mipmap -> mehr bilder. für App-Symbol verwendet?
xml -> mehr xml Dateien.
src -> verhält sich wie JavaScript in HTML. Layoutdateien initiieren die Startansicht und Ihre Java-Datei steuert dynamisch die Tag-Elemente und löst Ereignisse aus. Ereignisse können ebenso wie in HTML direkt in der layout.xml aktiviert werden.
AndroidManifest.xml -> Diese Datei registriert, worum es in Ihrer App geht. Anwendungsname, Programmtyp, erforderliche Berechtigungen usw. Dies scheint Android ziemlich sicher zu machen. Programme können buchstäblich nicht das tun, wonach sie im Manifest nicht gefragt haben.
Jetzt gibt es 4 Arten von Android-Programmen, eine Aktivität, einen Dienst, einen Inhaltsanbieter und einen Rundfunkempfänger. Unsere Tastatur wird ein Dienst sein, der es ermöglicht, sie im Hintergrund auszuführen. Es wird nicht in der Liste der zu startenden Apps angezeigt. aber es kann deinstalliert werden.
Um Ihre App zu kompilieren, müssen Sie gradle und apk signieren. Sie können dies erforschen oder APK Builder für Android verwenden. Es ist super einfach.
Nachdem wir die Android-Entwicklung verstanden haben, können wir die Dateien und Ordner erstellen.
Erstellen Sie die Dateien und Ordner wie oben beschrieben. Mein Verzeichnis sieht wie folgt aus:
NumPad
AndroidManifest.xml
src
Saragch
num_pad
MyInputMethodService.java
res
zeichnbar
Suragch_NumPad_icon.png
Layout
key_preview.xml
keyboard_view.xml
xml
method.xml
number_pad.xml
Werte
Farben.xml
string.xml
styles.xml
Denken Sie daran, wenn Sie eine Idee wie Android Studio verwenden, enthält diese möglicherweise eine Projektdatei.
Natürlich kann dies leicht nach Ihren Wünschen bearbeitet werden. Sie können sogar Bilder anstelle von Wörtern für das Etikett verwenden.
Suragch demonstrierte die Dateien im Werteordner nicht und ging davon aus, dass wir Zugriff auf Android Studio hatten. das erstellt sie automatisch. Gut, dass ich APK Builder habe.
<resources><!-- Base application theme. --><stylename="AppTheme"parent="android:Theme.Material.Light.DarkActionBar"><!-- Customize your theme here.--></style></resources>
H: Numpad / AndroidManifest.xml
Dies ist die Datei, die wirklich zur Erweiterung bereit war. Hier hatte ich das Gefühl, ich würde mein Programm niemals kompilieren. Schluchzen. Schluchzen. Wenn Sie Suracghs Antwort überprüfen, sehen Sie, dass er die ersten Felder leer lässt und das Aktivitäts-Tag in diese Datei einfügt. Wie gesagt, es gibt vier Arten von Android-Programmen. Eine Aktivität ist eine reguläre App mit einem Startsymbol. Dieser Nummernblock ist keine Aktivität! Außerdem hat er keine Aktivität durchgeführt.
Meine Freunde enthalten das Aktivitäts-Tag nicht. Ihr Programm wird kompiliert und stürzt ab, wenn Sie versuchen, es zu starten! Wie für xmlns: android und used-sdk; Ich kann dir da nicht helfen. Probieren Sie einfach meine Einstellungen aus, wenn sie funktionieren.
Wie Sie sehen, gibt es ein Service-Tag, das es als Service registriert. Außerdem muss service.android:name der Name des öffentlichen Klassenerweiterungsdienstes in unserer Java-Datei sein. Es muss entsprechend aktiviert werden. Paket ist auch der Name des Pakets, das wir in der Java-Datei deklariert haben.
Hinweis: Ich denke, Java ist eine Alternative zu src.
Dies war eine weitere Problemdatei, aber nicht so umstritten wie die Manifestdatei. Da ich Java gut genug kenne, um zu wissen, was was ist, was nicht. Ich kenne XML kaum und wie es mit der Android-Entwicklung zusammenhängt!
Das Problem hier war, dass er nichts importierte! Ich meine, er hat uns eine "vollständige" Datei gegeben, die Namen verwendet, die nicht aufgelöst werden konnten! InputMethodService, Tastatur usw. Das ist eine schlechte Praxis, Mr. Suragch. Vielen Dank, dass Sie mir geholfen haben, aber wie haben Sie erwartet, dass der Code kompiliert wird, wenn die Namen nicht aufgelöst werden können?
Es folgt die korrekt bearbeitete Version. Ich habe mich zufällig auf ein paar Tipps gestürzt, um mich an den richtigen Ort zu bringen und zu erfahren, was genau importiert werden soll.
packageSaragch.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;publicclassMyInputMethodServiceextendsInputMethodServiceimplementsKeyboardView.OnKeyboardActionListener{@OverridepublicView onCreateInputView(){// get the KeyboardView and add our Keyboard layout to itKeyboardView keyboardView =(KeyboardView)getLayoutInflater().inflate(R.layout.keyboard_view,null);Keyboard keyboard =newKeyboard(this, R.xml.number_pad);
keyboardView.setKeyboard(keyboard);
keyboardView.setOnKeyboardActionListener(this);return keyboardView;}@Overridepublicvoid onKey(int primaryCode,int[] keyCodes){InputConnection ic = getCurrentInputConnection();if(ic ==null)return;switch(primaryCode){caseKeyboard.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);}}@Overridepublicvoid onPress(int primaryCode){}@Overridepublicvoid onRelease(int primaryCode){}@Overridepublicvoid onText(CharSequence text){}@Overridepublicvoid swipeLeft(){}@Overridepublicvoid swipeRight(){}@Overridepublicvoid swipeDown(){}@Overridepublicvoid swipeUp(){}}
Kompilieren und signieren Sie Ihr Projekt.
Hier bin ich als neuer Android-Entwickler ahnungslos. Ich würde es gerne manuell lernen, da ich glaube, dass echte Programmierer manuell kompilieren können.
Ich denke, Gradle ist eines der Werkzeuge zum Kompilieren und Verpacken von apk. apk scheint wie eine jar-datei oder eine rar für zip-datei zu sein. Es gibt dann zwei Arten der Unterzeichnung. Debug-Schlüssel, der im Play Store und im privaten Schlüssel nicht zulässig ist.
Lassen Sie uns Herrn Saragch helfen. Und danke, dass du mein Video gesehen hast. Wie abonnieren.
Antworten:
Zunächst benötigen Sie eine
keyboard.xml
Datei, die imres/xml
Ordner abgelegt wird (falls der Ordner nicht vorhanden ist, erstellen Sie ihn).** Beachten Sie, dass Sie das
backspace
Zeichenelement erstellen und mit einer sehr kleinen Größe (z. B. 18 x 18 Pixel) im Ordner res / drawable-ldpi ablegen müssen.Dann sollten Sie in der XML-Datei, in der sie verwendet werden soll (wo sich Ihre TextView befindet), den folgenden Code hinzufügen:
** Beachten Sie, dass die XML-Datei, in die Sie die Datei einfügen
android.inputmethodservice.KeyboardView
, vorhanden sein muss, um die DateiRelativeLayout
festlegen zu könnenalignParentBottom="true"
die Tastatur vornehmen (normalerweise werden die Tastaturen am unteren Bildschirmrand angezeigt).Anschließend müssen Sie den folgenden Code in die
onCreate
Funktion einfügenActivity
, mit derTextView
Sie die Tastatur anbringen möchten** Beachten Sie, dass
mKeyboard
undmKeyboardView
private Klassenvariablen sind, die Sie erstellen müssen.Dann benötigen Sie die folgende Funktion zum Öffnen der Tastatur (Sie müssen sie über die
onClick
xml-Eigenschaft mit TextView verknüpfen ).Und schließlich brauchen Sie das
OnKeyboardActionListener
, was Ihre Ereignisse behandeltHoffentlich hilft das!!!
Der größte Teil des Codes wurde hier gefunden
quelle
Systemtastatur
In dieser Antwort erfahren Sie, wie Sie eine benutzerdefinierte Systemtastatur erstellen, die in jeder App verwendet werden kann, die ein Benutzer auf seinem Telefon installiert hat. Wenn Sie eine Tastatur erstellen möchten, die nur in Ihrer eigenen App verwendet wird, lesen Sie meine andere Antwort .
Das folgende Beispiel sieht folgendermaßen aus. Sie können es für jedes Tastaturlayout ändern.
Die folgenden Schritte zeigen, wie Sie eine funktionierende benutzerdefinierte Systemtastatur erstellen. So viel wie möglich habe ich versucht, unnötigen Code zu entfernen. Wenn Sie weitere Funktionen benötigen, habe ich am Ende Links zu weiterer Hilfe bereitgestellt.
1. Starten Sie ein neues Android-Projekt
Ich habe mein Projekt "Custom Keyboard" genannt. Nennen Sie es wie Sie wollen. Hier gibt es nichts Besonderes. Ich werde einfach die
MainActivity
und "Hallo Welt!" Layout wie es ist.2. Fügen Sie die Layoutdateien hinzu
Fügen Sie dem
res/layout
Ordner Ihrer App die folgenden zwei Dateien hinzu:keyboard_view.xml
Diese Ansicht ist wie ein Container, der unsere Tastatur enthält. In diesem Beispiel gibt es nur eine Tastatur, aber Sie können auch andere Tastaturen hinzufügen und diese ein- und austauschen
KeyboardView
.key_preview.xml
Die Tastenvorschau ist ein Layout, das beim Drücken einer Tastaturtaste angezeigt wird. Es zeigt nur, welche Taste Sie drücken (falls Ihre großen, fetten Finger sie bedecken). Dies ist kein Multiple-Choice-Popup. Schauen Sie sich dazu die Kandidatenansicht an .
3. Fügen Sie unterstützende XML-Dateien hinzu
Erstellen Sie einen
xml
Ordner in Ihremres
Ordner. (Klicken Sie mit der rechten Maustasteres
und wählen Sie Neu> Verzeichnis .)Fügen Sie dann die folgenden zwei XML-Dateien hinzu. (Klicken Sie mit der rechten Maustaste auf den
xml
Ordner und wählen Sie Neu> XML-Ressourcendatei .)number_pad.xml
Hier wird es immer interessanter. Dies
Keyboard
definiert das Layout der Tasten .Hier sind einige Dinge zu beachten:
keyWidth
: Dies ist die Standardbreite jedes Schlüssels. Die20%p
bedeutet , dass jeder Schlüssel sollte 20% der Breite des einnehmen p Arent. Es kann jedoch von einzelnen Tasten überschrieben werden, wie Sie mit den Tasten Löschen und Eingeben in der dritten Zeile sehen können.keyHeight
: Es ist hier fest codiert, aber Sie können es verwenden@dimen/key_height
, um es dynamisch für verschiedene Bildschirmgrößen einzustellen.Gap
: Die horizontale und vertikale Lücke gibt an, wie viel Platz zwischen den Tasten verbleibt. Auch wenn Sie es einstellen,0px
gibt es immer noch eine kleine Lücke.codes
: Dies kann ein Unicode- oder benutzerdefinierter Codewert sein, der bestimmt, was passiert oder was eingegeben wird, wenn die Taste gedrückt wird. ÜberprüfenkeyOutputText
Sie, ob Sie eine längere Unicode-Zeichenfolge eingeben möchten.keyLabel
: Dies ist der Text, der auf der Taste angezeigt wird.keyEdgeFlags
: Dies gibt an, an welcher Kante der Schlüssel ausgerichtet werden soll.isRepeatable
: Wenn Sie die Taste gedrückt halten, wird die Eingabe wiederholt.method.xml
Diese Datei teilt dem System die verfügbaren Untertypen der Eingabemethode mit. Ich füge hier nur eine Minimalversion hinzu.
4. Fügen Sie den Java-Code hinzu, um die Schlüsseleingabe zu verarbeiten
Erstellen Sie eine neue Java-Datei. Nennen wir es
MyInputMethodService
. Diese Datei verbindet alles miteinander. Es verarbeitet die von der Tastatur empfangenen Eingaben und sendet sie an die Ansicht weiter, die sie empfängt (EditText
z. B.).Anmerkungen:
OnKeyboardActionListener
wartet auf Tastatureingaben. In diesem Beispiel sind auch alle diese leeren Methoden erforderlich.InputConnection
ist das, was verwendet wird , Eingabe in einer anderen Ansicht wie ein zu sendenEditText
.5. Aktualisieren Sie das Manifest
Ich habe dies eher als letztes als als erstes gesetzt, da es sich auf die Dateien bezieht, die wir bereits oben hinzugefügt haben. Um Ihre benutzerdefinierte Tastatur als Systemtastatur zu registrieren, müssen
service
Sie Ihrer Datei AndroidManifest.xml einen Abschnitt hinzufügen . Setzen Sie es in denapplication
Abschnitt nachactivity
.Das ist es! Sie sollten Ihre App jetzt ausführen können. Sie werden jedoch nicht viel sehen, bis Sie Ihre Tastatur in den Einstellungen aktivieren.
6. Aktivieren Sie die Tastatur in den Einstellungen
Jeder Benutzer, der Ihre Tastatur verwenden möchte, muss sie in den Android-Einstellungen aktivieren. Ausführliche Anweisungen dazu finden Sie unter folgendem Link:
Hier ist eine Zusammenfassung:
Jetzt sollten Sie Ihre Tastatur überall dort verwenden können, wo Sie Android eingeben können.
Weitere Studie
Die obige Tastatur ist verwendbar, aber um eine Tastatur zu erstellen, die andere Benutzer verwenden möchten, müssen Sie wahrscheinlich weitere Funktionen hinzufügen. Lesen Sie die folgenden Links, um zu erfahren, wie.
Weiter geht's
Gefällt dir nicht, wie der Standard
KeyboardView
aussieht und sich verhält? Ich sicherlich nicht. Es sieht so aus, als ob es seit Android 2.0 nicht mehr aktualisiert wurde. Wie wäre es mit all diesen benutzerdefinierten Tastaturen im Play Store? Sie sehen nicht wie die hässliche Tastatur oben aus.Die gute Nachricht ist, dass Sie das Aussehen und Verhalten Ihrer eigenen Tastatur vollständig anpassen können. Sie müssen die folgenden Dinge tun:
ViewGroup
. Sie können es mitButton
s füllen oder sogar Ihre eigenen benutzerdefinierten Schlüsselansichten für diese Unterklasse erstellenView
. Wenn Sie Popup-Ansichten verwenden, beachten Sie dies .onKeyClicked(String text)
oderonBackspace()
.keyboard_view.xml
,key_preview.xml
odernumber_pad.xml
beschrieben in den Richtungen oben , da diese alle für den StandardKeyboardView
. Sie werden alle diese UI-Aspekte in Ihrer benutzerdefinierten Ansicht behandeln.MyInputMethodService
Klasse implementieren die benutzerdefinierte Tastatur Hörer , dass Sie in Ihrer Tastatur - Klasse definiert. Dies ist anstelle vonKeyboardView.OnKeyboardActionListener
, was nicht mehr benötigt wird.MyInputMethodService
deronCreateInputView()
Methode Ihrer Klasse eine Instanz Ihrer benutzerdefinierten Tastatur und geben Sie sie zurück. Vergessen Sie nicht, den benutzerdefinierten Listener der Tastatur auf einzustellenthis
.quelle
In-App-Tastatur
In dieser Antwort erfahren Sie, wie Sie eine benutzerdefinierte Tastatur erstellen, die ausschließlich in Ihrer App verwendet wird. Wenn Sie eine Systemtastatur erstellen möchten, die in jeder App verwendet werden kann, lesen Sie meine andere Antwort .
Das Beispiel wird so aussehen. Sie können es für jedes Tastaturlayout ändern.
1. Starten Sie ein neues Android-Projekt
Ich habe mein Projekt benannt
InAppKeyboard
. Rufen Sie Ihre an, wie Sie wollen.2. Fügen Sie die Layoutdateien hinzu
Tastaturbelegung
Fügen Sie dem
res/layout
Ordner eine Layoutdatei hinzu. Ich habe meine angerufenkeyboard
. Die Tastatur ist eine benutzerdefinierte zusammengesetzte Ansicht , die wir aus dieser XML-Layoutdatei aufblasen. Sie können ein beliebiges Layout verwenden, um die Tasten anzuordnen, aber ich verwende einLinearLayout
. Beachten Sie diemerge
Tags.res / layout / keyboard.xml
Aktivitätslayout
Zu Demonstrationszwecken hat unsere Aktivität eine einzige
EditText
und die Tastatur befindet sich unten. Ich habe meine benutzerdefinierte Tastaturansicht aufgerufenMyKeyboard
. (Wir werden diesen Code bald hinzufügen, ignorieren Sie den Fehler also vorerst.) Der Vorteil, wenn Sie unseren gesamten Tastaturcode in einer einzigen Ansicht zusammenfassen, besteht darin, dass die Wiederverwendung in einer anderen Aktivität oder App vereinfacht wird.res / layout / activity_main.xml
3. Fügen Sie die Tastatur-Java-Datei hinzu
Fügen Sie eine neue Java-Datei hinzu. Ich habe meine angerufen
MyKeyboard
.Das Wichtigste dabei ist, dass es keine feste Verbindung zu einem
EditText
oder gibtActivity
. Dies macht es einfach, es an jede App oder Aktivität anzuschließen, die es benötigt. Diese benutzerdefinierte Tastaturansicht verwendet auch eineInputConnection
, die die Art und Weise nachahmt, wie eine Systemtastatur mit einer kommuniziertEditText
. So vermeiden wir die harten Verbindungen.MyKeyboard
ist eine zusammengesetzte Ansicht, die das oben definierte Ansichtslayout aufbläst.MyKeyboard.java
4. Zeigen Sie mit der Tastatur auf den EditText
Bei Systemtastaturen verwendet Android einen InputMethodManager , um die Tastatur auf den Fokus zu richten
EditText
. In diesem Beispiel wird die Aktivität an ihre Stelle treten, indem der Link vonEditText
zu unserer benutzerdefinierten Tastatur zu bereitgestellt wird .Da wir die Systemtastatur nicht verwenden, müssen wir sie deaktivieren, damit sie beim Berühren der nicht auftaucht
EditText
. Zweitens müssen wir dasInputConnection
von der bekommenEditText
und es unserer Tastatur geben.MainActivity.java
Wenn Ihre Aktivität mehrere EditTexts enthält, müssen Sie Code schreiben, um die richtigen EditText-Dateien
InputConnection
an die Tastatur zu übergeben. (Sie können dies tun, indem Sie einOnFocusChangeListener
undOnClickListener
zu den EditTexts hinzufügen. Weitere Informationen hierzu finden Sie in diesem Artikel .) Möglicherweise möchten Sie Ihre Tastatur auch zu geeigneten Zeiten ausblenden oder anzeigen .Fertig
Das ist es. Sie sollten jetzt in der Lage sein, die Beispiel-App auszuführen und Text wie gewünscht einzugeben oder zu löschen. Ihr nächster Schritt besteht darin, alles an Ihre eigenen Bedürfnisse anzupassen. In einigen meiner Tastaturen habe ich beispielsweise TextViews anstelle von Schaltflächen verwendet, da es einfacher ist, sie anzupassen.
Anmerkungen
TextView
a verwenden,Button
wenn die Schlüssel besser aussehen sollen. Machen Sie dann einfach den Hintergrund zu einem Zeichenobjekt, das den Status des Erscheinungsbilds beim Drücken ändert.View
und benutzerdefinierte Tastaturen für UnterklassenViewGroup
. Die Tastatur legt alle Tasten programmgesteuert an. Die Tasten verwenden eine Schnittstelle zur Kommunikation mit der Tastatur (ähnlich wie Fragmente mit einer Aktivität kommunizieren). Dies ist nicht erforderlich, wenn Sie nur ein einziges Tastaturlayout benötigen, da das XML-Layout dafür einwandfrei funktioniert. Aber wenn Sie ein Beispiel sehen wollen , was ich gearbeitet haben, überprüfen Sie alleKey*
undKeyboard*
Klassen hier . Beachten Sie, dass ich dort auch eine Containeransicht verwende, deren Funktion es ist, Tastaturen ein- und auszutauschen.quelle
InputMethodManager#showInputMethodPicker()
. Wenn die ursprüngliche Tastatur jedoch nicht über eine solche Taste verfügt, können Benutzer nur manuell in den Systemeinstellungen zu Ihrer Tastatur wechseln. Apple ist Android in diesem Bereich überlegen, da Apple für alle Tastaturen eine Tastaturumschalttaste benötigt.EditText
s hat, müssen Sie ihnen eine hinzufügenonFocusChangedListener
, damit Sie, wenn sie den Fokus erhalten, dieInputConnection
von der aktuellenEditText
zu Ihrer benutzerdefinierten Tastatur zuweisen können .Verwendung
KeyboardView
:Jetzt haben Sie
kbd
eine normale Ansicht.Das Schöne daran ist, dass es
R.xml.custom
sich um/res/xml/custom.xml
das Layout der Tastatur handelt, das in XML definiert. Weitere Informationen zu dieser Datei finden Sie hier: Tastatur , Keyboard.Row , Keyboard.Key .quelle
Hier ist ein Beispielprojekt für eine Softtastatur.
https://developer.android.com/guide/topics/text/creating-input-method.html
Ihre sollten in den gleichen Zeilen mit einem anderen Layout sein.
Bearbeiten: Wenn Sie die Tastatur nur in Ihrer Anwendung benötigen, ist es sehr einfach! Erstellen Sie ein lineares Layout mit vertikaler Ausrichtung und erstellen Sie darin 3 lineare Layouts mit horizontaler Ausrichtung. Platzieren Sie dann die Schaltflächen jeder Zeile in jedem dieser horizontalen linearen Layouts und weisen Sie den Schaltflächen die Eigenschaft weight zu. Verwenden Sie android: layout_weight = 1 für alle, damit sie gleich weit voneinander entfernt sind.
Dies wird lösen. Wenn Sie nicht das bekommen haben, was erwartet wurde, posten Sie bitte den Code hier und wir sind hier, um Ihnen zu helfen!
quelle
Eines der am besten dokumentierten Beispiele, die ich gefunden habe.
http://www.fampennings.nl/maarten/android/09keyboard/index.htm
KeyboardView
Zugehörige XML-Dateien und Quellcode werden bereitgestellt.quelle
Ich bin kürzlich auf diesen Beitrag gestoßen, als ich versucht habe zu entscheiden, mit welcher Methode ich meine eigene benutzerdefinierte Tastatur erstellen möchte. Ich fand die Android-System-API sehr eingeschränkt und entschied mich daher, meine eigene In-App-Tastatur zu erstellen. Mit Suragch Antwort als Grundlage für meine Forschung, ging ich auf entwerfen meine eigene Tastatur Komponente . Es ist auf GitHub mit einer MIT-Lizenz veröffentlicht. Hoffentlich spart dies jemand anderem viel Zeit und Kopfschmerzen.
Die Architektur ist ziemlich flexibel. Es gibt eine Hauptansicht (CustomKeyboardView), die Sie mit jedem gewünschten Tastaturlayout und Controller einfügen können.
Sie müssen nur die CustomKeyboardView in Ihrer Aktivitäts-XML deklarieren (Sie können dies auch programmgesteuert tun):
Registrieren Sie dann Ihre EditText-Dateien und teilen Sie ihr mit, welche Art von Tastatur sie verwenden sollen:
Das CustomKeyboardView erledigt den Rest!
Ich habe den Ball mit einer Number-, NumberDecimal- und QWERTZ-Tastatur ins Rollen gebracht. Laden Sie es herunter und erstellen Sie Ihre eigenen Layouts und Controller. Es sieht aus wie das:
Auch wenn dies nicht die Architektur ist, für die Sie sich entscheiden, ist es hoffentlich hilfreich, den Quellcode für eine funktionierende In-App-Tastatur anzuzeigen.
Hier ist wieder der Link zum Projekt: Benutzerdefinierte In-App-Tastatur
quelle
Nun, Suragch gab bisher die beste Antwort, aber er übersprang einige kleinere Dinge, die für die Kompilierung der App wichtig waren.
Ich hoffe, eine bessere Antwort als Suragch zu geben, indem ich seine Antwort verbessere. Ich werde alle fehlenden Elemente hinzufügen, die er nicht gesetzt hat.
Ich habe meine apk mit der android app APK Builder 1.1.0 kompiliert. Also fangen wir an.
Um eine Android-App zu erstellen, benötigen wir einige Dateien und Ordner, die in einem bestimmten Format organisiert und entsprechend groß geschrieben sind.
res layout -> xml-Dateien, die zeigen, wie die App auf dem Telefon aussehen wird. Ähnlich wie HTML das Aussehen der Webseite im Browser beeinflusst. Ermöglichen, dass Ihre App entsprechend auf Bildschirme passt.
Werte -> konstante Daten wie Farben.xml, Zeichenfolgen.xml, Stile.xml. Diese Dateien müssen richtig geschrieben sein.
zeichnbar -> Bilder {jpeg, png, ...}; Nennen Sie sie irgendetwas.
mipmap -> mehr bilder. für App-Symbol verwendet?
xml -> mehr xml Dateien.
src -> verhält sich wie JavaScript in HTML. Layoutdateien initiieren die Startansicht und Ihre Java-Datei steuert dynamisch die Tag-Elemente und löst Ereignisse aus. Ereignisse können ebenso wie in HTML direkt in der layout.xml aktiviert werden.
AndroidManifest.xml -> Diese Datei registriert, worum es in Ihrer App geht. Anwendungsname, Programmtyp, erforderliche Berechtigungen usw. Dies scheint Android ziemlich sicher zu machen. Programme können buchstäblich nicht das tun, wonach sie im Manifest nicht gefragt haben.
Jetzt gibt es 4 Arten von Android-Programmen, eine Aktivität, einen Dienst, einen Inhaltsanbieter und einen Rundfunkempfänger. Unsere Tastatur wird ein Dienst sein, der es ermöglicht, sie im Hintergrund auszuführen. Es wird nicht in der Liste der zu startenden Apps angezeigt. aber es kann deinstalliert werden.
Um Ihre App zu kompilieren, müssen Sie gradle und apk signieren. Sie können dies erforschen oder APK Builder für Android verwenden. Es ist super einfach.
Nachdem wir die Android-Entwicklung verstanden haben, können wir die Dateien und Ordner erstellen.
Erstellen Sie die Dateien und Ordner wie oben beschrieben. Mein Verzeichnis sieht wie folgt aus:
Denken Sie daran, wenn Sie eine Idee wie Android Studio verwenden, enthält diese möglicherweise eine Projektdatei.
A: NumPad / res / layout / key_preview.xml
B: NumPad / res / layout / keyboard_view.xml
C: NumPad / res / xml / method.xml
D: Numpad / res / xml / number_pad.xml
Natürlich kann dies leicht nach Ihren Wünschen bearbeitet werden. Sie können sogar Bilder anstelle von Wörtern für das Etikett verwenden.
Suragch demonstrierte die Dateien im Werteordner nicht und ging davon aus, dass wir Zugriff auf Android Studio hatten. das erstellt sie automatisch. Gut, dass ich APK Builder habe.
E: NumPad / res / values / colours.xml
F: NumPad / res / values / strings.xml
G: NumPad / res / values / styles.xml
H: Numpad / AndroidManifest.xml
Dies ist die Datei, die wirklich zur Erweiterung bereit war. Hier hatte ich das Gefühl, ich würde mein Programm niemals kompilieren. Schluchzen. Schluchzen. Wenn Sie Suracghs Antwort überprüfen, sehen Sie, dass er die ersten Felder leer lässt und das Aktivitäts-Tag in diese Datei einfügt. Wie gesagt, es gibt vier Arten von Android-Programmen. Eine Aktivität ist eine reguläre App mit einem Startsymbol. Dieser Nummernblock ist keine Aktivität! Außerdem hat er keine Aktivität durchgeführt.
Meine Freunde enthalten das Aktivitäts-Tag nicht. Ihr Programm wird kompiliert und stürzt ab, wenn Sie versuchen, es zu starten! Wie für xmlns: android und used-sdk; Ich kann dir da nicht helfen. Probieren Sie einfach meine Einstellungen aus, wenn sie funktionieren.
Wie Sie sehen, gibt es ein Service-Tag, das es als Service registriert. Außerdem muss service.android:name der Name des öffentlichen Klassenerweiterungsdienstes in unserer Java-Datei sein. Es muss entsprechend aktiviert werden. Paket ist auch der Name des Pakets, das wir in der Java-Datei deklariert haben.
I: NumPad / src / Saragch / num_pad / MyInputMethodService.java
Hinweis: Ich denke, Java ist eine Alternative zu src.
Dies war eine weitere Problemdatei, aber nicht so umstritten wie die Manifestdatei. Da ich Java gut genug kenne, um zu wissen, was was ist, was nicht. Ich kenne XML kaum und wie es mit der Android-Entwicklung zusammenhängt!
Das Problem hier war, dass er nichts importierte! Ich meine, er hat uns eine "vollständige" Datei gegeben, die Namen verwendet, die nicht aufgelöst werden konnten! InputMethodService, Tastatur usw. Das ist eine schlechte Praxis, Mr. Suragch. Vielen Dank, dass Sie mir geholfen haben, aber wie haben Sie erwartet, dass der Code kompiliert wird, wenn die Namen nicht aufgelöst werden können?
Es folgt die korrekt bearbeitete Version. Ich habe mich zufällig auf ein paar Tipps gestürzt, um mich an den richtigen Ort zu bringen und zu erfahren, was genau importiert werden soll.
Kompilieren und signieren Sie Ihr Projekt.
Hier bin ich als neuer Android-Entwickler ahnungslos. Ich würde es gerne manuell lernen, da ich glaube, dass echte Programmierer manuell kompilieren können.
Ich denke, Gradle ist eines der Werkzeuge zum Kompilieren und Verpacken von apk. apk scheint wie eine jar-datei oder eine rar für zip-datei zu sein. Es gibt dann zwei Arten der Unterzeichnung. Debug-Schlüssel, der im Play Store und im privaten Schlüssel nicht zulässig ist.
Lassen Sie uns Herrn Saragch helfen. Und danke, dass du mein Video gesehen hast. Wie abonnieren.
quelle
Hatte das gleiche Problem. Zuerst habe ich das Tabellenlayout verwendet, aber das Layout änderte sich nach einem Knopfdruck ständig. Fand diese Seite allerdings sehr nützlich. http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-creating-a-numeric-keypad-with-gridlayout/
quelle