it-swarm.com.de

Wie erstelle ich eine Android-Tastatur?

Ich möchte eine benutzerdefinierte Tastatur erstellen. Ich weiß nicht, wie ich es in XML und Aktivitäten machen soll. Dieses Bild ist mein Tastaturmodell. Es braucht nur Zahlen.

enter image description here

72
XX_brother

Zunächst benötigen Sie eine keyboard.xml-Datei, die im Ordner res/xml abgelegt wird (wenn der Ordner nicht vorhanden ist, wird er erstellt).

<?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 Zeichen backspace drawable erstellen und in dem Ordner res/drawable-ldpi mit einer sehr geringen Größe (z. B. 18 x 18 Pixel) ablegen müssen.

In der XML-Datei, die Sie verwenden möchten (wo sich Ihre TextView befindet), sollten Sie 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 den Android.inputmethodservice.KeyboardView legen, RelativeLayout sein muss, um den alignParentBottom="true" einstellen zu können (in der Regel werden die Tastaturen am unteren Bildschirmrand angezeigt).

Dann müssen Sie den folgenden Code in die onCreate-Funktion von Activity einfügen, der die TextView verarbeitet, an die Sie die Tastatur anschließen 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 Eigenschaft onClick xml mit der 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 zum Schluss benötigen Sie den OnKeyboardActionListener, der 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!!!

Die meisten Code gefunden hier

69
Pontios

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, dann siehe meine andere Antwort .

Das folgende Beispiel sieht folgendermaßen aus. Sie können es für jedes Tastaturlayout ändern.

enter image description here

Die folgenden Schritte zeigen, wie Sie eine funktionierende benutzerdefinierte Systemtastatur erstellen. Ich habe versucht, so viel wie möglich unnötigen Code zu entfernen. Wenn Sie weitere Funktionen benötigen, habe ich am Ende Links zu weiteren Hilfeinformationen bereitgestellt.

1. Starten Sie ein neues Android Projekt

Ich habe mein Projekt "Custom Keyboard" genannt. Nennen Sie es wie Sie wollen. Sonst gibt es hier nichts Besonderes. Ich werde nur die MainActivity und "Hallo Welt!" Layout wie es ist.

2. Fügen Sie die Layoutdateien hinzu

Fügen Sie die folgenden zwei Dateien zum Ordner res/layout Ihrer App 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 andere Tastaturen hinzufügen und diese ein- und auslagern 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 angezeigt wird, wenn Sie eine Tastaturtaste drücken. Es wird nur angezeigt, welche Taste Sie drücken (falls Ihre großen, fetten Finger sie verdecken). 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>

3. Fügen Sie unterstützende XML-Dateien hinzu

Erstellen Sie einen Ordner xml in Ihrem Ordner res. (Klicken Sie mit der rechten Maustaste auf 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 Ordner xml und wählen Sie Neu> XML-Ressourcendatei .)

  • number_pad.xml
  • method.xml

number_pad.xml

Hier wird es interessanter. Dieses 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. Das 20%p Bedeutet, dass jeder Schlüssel 20% der Breite des p -Arents einnehmen soll. Sie kann jedoch durch einzelne Tasten überschrieben werden, wie Sie anhand der Tasten "Entf" und "Eingabe" in der dritten Zeile sehen können.
  • keyHeight : Hier ist es hart codiert, aber Sie könnten etwas wie @dimen/key_height verwenden, um es dynamisch für verschiedene Bildschirmgrößen einzustellen.
  • Gap : Der horizontale und vertikale Abstand gibt an, wie viel Platz zwischen den Tasten verbleibt. Auch wenn Sie 0px Einstellen, bleibt 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. Siehe keyOutputText , wenn Sie eine längere Unicode-Zeichenfolge eingeben möchten.
  • keyLabel : Dies ist der Text, der auf der Taste angezeigt wird.
  • keyEdgeFlags : Gibt an, an welcher Kante die Taste 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 Subtypen 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>

4. Fügen Sie den Code Java zur Verarbeitung der Tasteneingabe hinzu

Erstellen Sie eine neue Java Datei. Nennen wir es MyInputMethodService. Diese Datei bindet alles zusammen. Sie verarbeitet Eingaben von der Tastatur und sendet sie an jede Ansicht, die sie empfängt (an EditText, zum Beispiel).

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:

  • Das OnKeyboardActionListener wartet auf Tastatureingaben. Es werden auch alle diese leeren Methoden in diesem Beispiel benötigt.
  • Das InputConnection wird verwendet, um Eingaben an eine andere Ansicht wie ein EditText zu senden.

5. Aktualisieren Sie das Manifest

Ich habe dies als letztes und nicht als erstes angegeben, da es sich auf die oben bereits hinzugefügten Dateien bezieht. Um Ihre benutzerdefinierte Tastatur als Systemtastatur zu registrieren, müssen Sie einen Abschnitt service zu Ihrer Datei AndroidManifest.xml hinzufügen. Fügen Sie es in den Abschnitt application nach activity ein.

<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 jetzt in der Lage sein, Ihre App auszuführen. 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 diese in den Android) -Einstellungen aktivieren. Ausführliche Anweisungen dazu finden Sie unter folgendem Link:

Hier ist eine Zusammenfassung:

  • 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 in der Lage sein, Ihre Tastatur überall dort zu verwenden, wo Sie Android eintippen 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 mehr Funktionen hinzufügen. Lesen Sie die folgenden Links, um zu erfahren, wie.

Los geht's

Gefällt dir nicht, wie der Standard KeyboardView aussieht und sich verhält? Das tue ich bestimmt nicht. Es sieht so aus, als wäre es seit Android 2.0. Wie wäre es mit all diesen benutzerdefinierten Tastaturen im Play Store? Sie sehen nicht so aus wie die hässliche Tastatur oben.

Die gute Nachricht ist, dass Sie das Aussehen und Verhalten Ihrer Tastatur vollständig anpassen können. Sie müssen die folgenden Dinge tun:

  1. Erstellen Sie Ihre eigene benutzerdefinierte Tastaturansicht, die die Unterklassen ViewGroup enthält. Sie können es mit Buttons füllen oder sogar Ihre eigenen benutzerdefinierten Schlüsselansichten erstellen, die die Unterklasse View enthalten. Wenn Sie Popup-Ansichten verwenden, ist beachten Sie dies .
  2. Fügen Sie eine benutzerdefinierte Ereignis-Listener Schnittstelle in Ihre Tastatur ein. Rufen Sie die Methoden für Dinge wie onKeyClicked(String text) oder onBackspace() auf.
  3. Sie müssen weder keyboard_view.xml Noch key_preview.xml Oder number_pad.xml Hinzufügen, wie in den obigen Anweisungen beschrieben, da dies alles für den Standard KeyboardView gilt. Sie werden alle diese UI-Aspekte in Ihrer benutzerdefinierten Ansicht behandeln.
  4. Implementieren Sie in Ihrer Klasse MyInputMethodService den benutzerdefinierten Tastaturlistener, den Sie in Ihrer Tastaturklasse definiert haben. Dies ist anstelle von KeyboardView.OnKeyboardActionListener, Das nicht mehr benötigt wird.
  5. Erstellen Sie in der onCreateInputView() -Methode Ihrer MyInputMethodService -Klasse eine Instanz Ihrer benutzerdefinierten Tastatur und geben Sie sie zurück. Vergessen Sie nicht, den benutzerdefinierten Listener der Tastatur auf this zu setzen.
53
Suragch

Verwenden Sie KeyboardView :

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

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

jetzt haben Sie kbd, was eine normale Ansicht ist.

Das Schöne daran ist, dass R.xml.custom auf /res/xml/custom.xml verweist, das in xml das Layout der Tastatur definiert. Weitere Informationen zu dieser Datei finden Sie hier: Keyboard , Keyboard.Row , Keyboard.Key .

30
bigstones

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, dann siehe meine andere Antwort .

Das Beispiel wird so aussehen. Sie können es für jedes Tastaturlayout ändern.

enter image description here

1. Starten Sie ein neues Android Projekt

Ich habe mein Projekt InAppKeyboard genannt. Rufen Sie an, wie Sie wollen.

2. Fügen Sie die Layoutdateien hinzu

Tastaturbelegung

Hinzufügen einer Layoutdatei zu res/layout Mappe. Ich habe mein keyboard angerufen. Die Tastatur wird eine benutzerdefinierte zusammengesetzte Ansicht sein, die wir aus dieser XML-Layoutdatei aufblasen. Sie können jedes beliebige 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 ein einzelnes EditText und die Tastatur befindet sich unten. Ich habe meine benutzerdefinierte Tastaturansicht MyKeyboard aufgerufen. (Wir werden diesen Code in Kürze hinzufügen. Ignorieren Sie daher den Fehler vorerst.) Der Vorteil der Zusammenfassung unseres gesamten Tastaturcodes in einer einzigen Ansicht 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>

3. Fügen Sie die Datei Keyboard Java hinzu

Füge eine neue Java Datei hinzu. Ich habe meine MyKeyboard aufgerufen.

Das Wichtigste dabei ist, dass es keine feste Verknüpfung zu EditText oder Activity gibt. Dies macht es einfach, es in jede App oder Aktivität zu stecken, die es benötigt. Diese benutzerdefinierte Tastaturansicht verwendet auch ein InputConnection , das die Art und Weise nachahmt, wie eine Systemtastatur mit einem EditText kommuniziert. So vermeiden wir die harten Verbindungen.

MyKeyboard ist eine zusammengesetzte Ansicht, die das oben definierte Ansichtslayout vergrößert.

MyKeyboard.Java

public class MyKeyboard extends LinearLayout implements View.OnClickListener {

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

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

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

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

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

    // Our communication link to the EditText
    InputConnection inputConnection;

    private void init(Context context, AttributeSet attrs) {

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

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

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

    @Override
    public void onClick(View v) {

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

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

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

4. Zeigen Sie mit der Tastatur auf den EditText

Bei Systemtastaturen verwendet Android) ein InputMethodManager , um die Tastatur auf das fokussierte EditText zu richten. In diesem Beispiel wird die Aktivität durch Bereitstellung ersetzt den link von der EditText zu unserer benutzerdefinierten tastatur zu.

Da wir die Systemtastatur nicht verwenden, müssen wir sie deaktivieren, damit sie beim Berühren von EditText nicht auftaucht. Zweitens müssen wir das InputConnection aus dem EditText holen 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 das InputConnection des richtigen EditTexts an die Tastatur zu übergeben. (Sie können dies tun, indem Sie ein OnFocusChangeListener und ein OnClickListener zu den EditTexts hinzufügen. Siehe dieser Artikel für eine Diskussion darüber.) Möglicherweise möchten Sie auch ein- oder ausblenden Ihre Tastatur zu geeigneten Zeiten.

Fertig

Das ist es. Sie sollten nun in der Lage sein, die Beispiel-App auszuführen und Text wie gewünscht einzugeben oder zu löschen. Der nächste Schritt besteht darin, alles an Ihre Bedürfnisse anzupassen. Zum Beispiel habe ich bei einigen meiner Tastaturen TextViews anstelle von Buttons verwendet, da es einfacher ist, sie anzupassen.

Anmerkungen

  • In der XML-Layoutdatei können Sie auch ein TextView anstelle eines Button verwenden, wenn die Schlüssel besser aussehen sollen. Stellen Sie dann einfach den Hintergrund als Zeichenfläche ein, die beim Drücken den Erscheinungszustand ändert.
  • Erweiterte benutzerdefinierte Tastaturen: Für mehr Flexibilität bei der Tastaturdarstellung und beim Tastaturwechsel werden jetzt benutzerdefinierte Tastaturansichten erstellt, die die Unterklasse View und benutzerdefinierte Tastaturen, die die Unterklasse ViewGroup enthalten. Die Tastatur ordnet 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 hierfür geeignet ist. Aber wenn Sie ein Beispiel von dem sehen möchten, woran ich gearbeitet habe, lesen Sie alle Key* und Keyboard* Klassen hier . Beachten Sie, dass ich dort auch eine Containeransicht verwende, deren Funktion darin besteht, Tastaturen ein- und auszutauschen.
26
Suragch

Hier ist ein Beispielprojekt für eine Soft-Tastatur.

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

Ihr sollte in den gleichen Zeilen mit einem anderen Layout stehen.

Edit: Wenn Sie die Tastatur nur in Ihrer Anwendung benötigen, ist dies sehr einfach! Erstellen Sie ein lineares Layout mit vertikaler Ausrichtung, und erstellen Sie 3 lineare Layouts mit horizontaler Ausrichtung Zeile in jedem dieser horizontalen linearen Layouts, und weisen Sie den Schaltflächen die Gewichtseigenschaft zu. Verwenden Sie Android: layout_weight = 1 für alle, damit sie gleichmäßig verteilt werden.

Das wird sich lösen. Wenn Sie nicht das bekommen haben, was Sie erwartet haben, schreiben Sie den Code hier, und wir sind hier, um Ihnen zu helfen!

14
nithinreddy

Eines der am besten dokumentierten Beispiele, die ich gefunden habe.

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

KeyboardView-bezogene XML-Datei und Quellcode werden bereitgestellt.

6
Youngjae

Hatte das gleiche Problem. Ich habe zuerst das Tabellenlayout verwendet, aber das Layout wurde nach einem Tastendruck ständig geändert. Fand diese Seite sehr nützlich. http://mobile.tutsplus.com/tutorials/Android/android-user-interface-design-creating-a-numeric-keypad-with-gridlayout/

1
jeydee

Ich bin vor kurzem auf diesen Beitrag gestoßen, als ich versuchte zu entscheiden, mit welcher Methode ich meine eigene Tastatur erstellen sollte. Ich fand die Android-System-API sehr eingeschränkt, also entschied ich mich, meine eigene In-App-Tastatur zu erstellen. Mit Suragchs Antwort als Grundlage für meine Recherche habe ich dann meine eigene Tastaturkomponente entworfen. Es wird auf GitHub mit einer MIT Lizenz veröffentlicht. Hoffentlich erspart dies jemandem viel Zeit und Kopfschmerzen.

Die Architektur ist ziemlich flexibel. Es gibt eine Hauptansicht (CustomKeyboardView), die Sie mit dem gewünschten Tastaturlayout und Controller einfügen können. 

Sie müssen lediglich die CustomKeyboardView in Ihrer Aktivitäts-XML angeben (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" />

Dann registrieren Sie Ihre EditText's und sagen Sie, 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)
}

Die CustomKeyboardView erledigt den Rest!

Ich habe den Ball mit einer Number-, NumberDecimal- und QWERTY - Tastatur ins Rollen gebracht. Fühlen Sie sich frei, um es herunterzuladen und erstellen Sie Ihre eigenen Layouts und Controller. Es sieht aus wie das:

Android custom keyboard gif landscape

enter image description here

Auch wenn dies nicht die Architektur ist, mit der Sie sich entscheiden, ist es hoffentlich hilfreich, den Quellcode für eine funktionierende In-App-Tastatur zu sehen.

Hier ist der Link zum Projekt: Benutzerdefinierte In-App-Tastatur

1
Don Brody

Nun, Suragch gab die bisher beste Antwort, übersprang jedoch einige kleinere Dinge, die für die Kompilierung der App wichtig waren.

Ich hoffe, dass ich eine bessere Antwort geben kann als Suragch, indem ich seine Antwort verbessere. Ich werde alle fehlenden Elemente hinzufügen, die er nicht gesetzt hat.

Ich habe meine apk mit der App Android, 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 einer Webseite im Browser beeinflusst. Ermöglichen, dass Ihre App entsprechend auf Bildschirme passt.

werte -> konstante Daten wie colors.xml, strings.xml, styles.xml. Diese Dateien müssen richtig geschrieben sein.

zeichenbar -> Bilder {jpeg, png, ...}; Nenne ihnen irgendetwas.

mipmap -> mehr bilder. für App-Symbol verwendet?

xml -> weitere 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 wie in HTML auch direkt in der layout.xml aktiviert werden.

AndroidManifest.xml -> Diese Datei registriert, worum es in Ihrer App geht. Anwendungsname, Art des Programms, 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, mit dem sie im Hintergrund ausgeführt werden kann. Es wird nicht in der Liste der zu startenden Apps angezeigt. es kann aber deinstalliert werden.

Um Ihre App zu kompilieren, müssen Sie gradle und apk signieren. Sie können dies recherchieren oder APK Builder für Android verwenden. Es ist super einfach.

Nachdem wir die Entwicklung von Android verstanden haben, lassen Sie uns die Dateien und Ordner erstellen.

  1. Erstellen Sie die Dateien und Ordner wie oben beschrieben. Mein Verzeichnis wird wie folgt aussehen:

    • NumPad
      • AndroidManifest.xml
      • src
        • Saragch
          • num_pad
            • MyInputMethodService.Java
      • res
        • ziehbar
          • Suragch_NumPad_icon.png
        • layout
          • key_preview.xml
          • keyboard_view.xml
        • xml
          • method.xml
          • number_pad.xml
        • werte
          • colors.xml
          • strings.xml
          • styles.xml

Denken Sie daran, dass bei Verwendung einer Idee wie Android Studio möglicherweise eine Projektdatei vorhanden ist.

  1. Dateien schreiben.

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 Ordner "values" 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 ​​/ colors.xml

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

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

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

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

<resources>

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

</resources>

H: Numpad/AndroidManifest.xml

Dies ist die Datei, die wirklich zur Auseinandersetzung 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 erste Gruppe von Feldern 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äten durchgeführt.

Meine Freunde enthalten das Aktivitäts-Tag nicht. Ihr Programm wird kompiliert, und wenn Sie versuchen, es zu starten, stürzt es ab! Was xmlns betrifft: Android und uses-sdk; Ich kann dir da nicht helfen. Probieren Sie einfach meine Einstellungen aus, wenn sie funktionieren.

Wie Sie sehen, gibt es eine Service-Tag-Nummer, die es als Dienst registriert. Auch service.Android:name muss der Name des öffentlichen Klassenerweiterungsdienstes in unserer Java -Datei sein. Es muss entsprechend aktiviert werden. Package ist auch der Name des Pakets, das wir in der Datei Java 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 andere Problemdatei, aber nicht so umstritten wie die Manifestdatei. Wie ich weiß Java gut genug, um zu wissen, was was ist, was nicht. Ich kenne xml kaum und weiß, wie es mit der Android-Entwicklung zusammenhängt!

Das Problem hier war, dass er nichts importierte! Ich meine, er gab uns eine "vollständige" Datei, 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 damit gerechnet, dass der Code kompiliert wird, wenn die Namen nicht aufgelöst werden können?

Es folgt die korrekt bearbeitete Version. Ich bin zufällig auf ein paar Tipps gestoßen, die mich an den richtigen Ort brachten, um zu erfahren, was genau zu importieren ist.

package Saragch.num_pad;

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

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

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


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

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

        InputConnection ic = getCurrentInputConnection();

        if (ic == null) return;

        switch (primaryCode)
        {
         case Keyboard.KEYCODE_DELETE:
            CharSequence selectedText = ic.getSelectedText(0);

            if (TextUtils.isEmpty(selectedText)) 
            {
             // no selection, so delete previous character
             ic.deleteSurroundingText(1, 0);
            }

            else 
            {
             // delete the selection
             ic.commitText("", 1);
            }

            ic.deleteSurroundingText(1, 0);
            break;

         default:
            char code = (char) primaryCode;
            ic.commitText(String.valueOf(code), 1);
        }
    }

    @Override
    public void onPress(int primaryCode) { }

    @Override
    public void onRelease(int primaryCode) { }

    @Override
    public void onText(CharSequence text) { }

    @Override
    public void swipeLeft() { }

    @Override
    public void swipeRight() { }

    @Override
    public void swipeDown() { }

    @Override
    public void swipeUp() { }
}
  1. Kompilieren und unterschreiben Sie Ihr Projekt.

    Dies ist, wo ich ahnungslos bin als Neueinsteiger von Android Entwickler. Ich würde es gerne manuell lernen, da ich glaube, dass echte Programmierer es manuell kompilieren können.

Ich denke gradle ist eines der tools zum kompilieren und packen von apk. apk ähnelt einer jar-datei oder einer rar-zip-datei. Es gibt dann zwei Arten des Signierens. Debug-Schlüssel, der im Play Store und im privaten Schlüssel nicht zulässig ist.

Nun, lassen Sie uns Mr. Saragch helfen. Und danke, dass du mein Video gesehen hast. Wie abonnieren.

0