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.
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.
Antworten:
Zunächst benötigen Sie eine keyboard.xml
Datei, die im res/xml
Ordner abgelegt wird (falls der Ordner nicht vorhanden ist, erstellen Sie ihn).
<?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>
** 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:
<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>
** Beachten Sie, dass die XML-Datei, in die Sie die Datei einfügen android.inputmethodservice.KeyboardView
, vorhanden sein muss, um die Datei RelativeLayout
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ügen Activity
, mit der TextView
Sie die Tastatur anbringen möchten
// 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);
** Beachten Sie, dass mKeyboard
und mKeyboardView
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 ).
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);
}
Und schließlich brauchen Sie das OnKeyboardActionListener
, was Ihre Ereignisse behandelt
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() {
}
};
Hoffentlich hilft das!!!
Der größte Teil des Codes wurde hier gefunden
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.
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.
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
.
<?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
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 .
<?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>
Erstellen Sie einen xml
Ordner in Ihrem res
Ordner. (Klicken Sie mit der rechten Maustaste res
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 .
<?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>
Hier sind einige Dinge zu beachten:
keyWidth
: Dies ist die Standardbreite jedes Schlüssels. Die 20%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üfen keyOutputText
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.
<?xml version="1.0" encoding="utf-8"?>
<input-method
xmlns:android="http://schemas.android.com/apk/res/android">
<subtype
android:imeSubtypeMode="keyboard"/>
</input-method>
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.).
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);
}
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() { }
}
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 senden EditText
.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 den application
Abschnitt nach 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>
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.
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.
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 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 mit Button
s füllen oder sogar Ihre eigenen benutzerdefinierten Schlüsselansichten für diese Unterklasse erstellen View
. Wenn Sie Popup-Ansichten verwenden, beachten Sie dies .onKeyClicked(String text)
oder onBackspace()
.keyboard_view.xml
, key_preview.xml
oder number_pad.xml
beschrieben in den Richtungen oben , da diese alle für den Standard KeyboardView
. 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 von KeyboardView.OnKeyboardActionListener
, was nicht mehr benötigt wird.MyInputMethodService
der 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.
Ich habe mein Projekt benannt InAppKeyboard
. Rufen Sie Ihre an, wie Sie wollen.
Tastaturbelegung
Fügen Sie dem res/layout
Ordner 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 merge
Tags.
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>
Aktivitätslayout
Zu Demonstrationszwecken hat unsere Aktivität eine einzige EditText
und 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.
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>
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 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
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;
}
}
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 EditText
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 das InputConnection
von der bekommen EditText
und es unserer Tastatur geben.
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);
}
}
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 ein OnFocusChangeListener
und OnClickListener
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 .
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.
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 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.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ügen onFocusChangedListener
, damit Sie, wenn sie den Fokus erhalten, die InputConnection
von der aktuellen EditText
zu Ihrer benutzerdefinierten Tastatur zuweisen können .
Verwendung KeyboardView
:
KeyboardView kbd = new KeyboardView(context);
kbd.setKeyboard(new Keyboard(this, R.xml.custom));
kbd.setOnKeyboardActionListener(new OnKeyboardActionListener() {
....
}
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 .
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!
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.
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):
<com.donbrody.customkeyboard.components.keyboard.CustomKeyboardView
android:id="@+id/customKeyboardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
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.
Hier ist wieder der Link zum Projekt: Benutzerdefinierte In-App-Tastatur
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
<?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: NumPad / 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: Numpad / 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>
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
<?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: 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.
<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: 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.
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() { }
}
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.
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/