De meeste Android-apparaten hebben geen fysiek toetsenbord. In plaats daarvan vertrouwen ze op een virtueel of zacht toetsenbord om gebruikersinvoer te accepteren. Als je van Android-personalisatie houdt, kan het ontwikkelen van een aangepast, zacht toetsenbord je hobby naar een heel nieuw niveau tillen.
Met de Android SDK kunt u snel een zacht toetsenbord maken met verrassend weinig coderegels, omdat de SDK veel van de taken op laag niveau uitvoert, zoals het herkennen van belangrijke aanrakingen, het tekenen van het toetsenbord en het tot stand brengen van verbindingen tussen het toetsenbord en invoervelden.
In deze zelfstudie leert u hoe u een volledig functioneel, zacht toetsenbord kunt maken dat kan dienen als het standaardtoetsenbord van uw Android-apparaat.
Als je gehaast bent, bekijk dan Android Keyboard Themes, een kant-en-klare oplossing van Envato Market.
De app geeft je de flexibiliteit om een van de 22 ingebouwde toetsenbordthema's te kiezen of je eigen aangepaste thema te maken.
Android-toetsenbordthema'sOf u kunt een freelancer inhuren op Envato Studio. Blader door onze sectie Mobile & Apps en je zult zonder twijfel een expert vinden die je kan helpen.
Mobiele & app-ontwikkelaars op Envato StudioAls je er de voorkeur aan geeft er zelf een te bouwen, lees dan verder om erachter te komen hoe.
U hebt de Eclipse ADT-bundel geïnstalleerd. Je kunt het downloaden van de Android Developer-website.
Start Eclipse op en maak een nieuwe Android-applicatie. Bel deze applicatie, SimpleKeyboard. Zorg ervoor dat u een unieke pakketnaam kiest. Stel de minimaal vereiste SDK in op Android 2.2 en stel de doel-SDK in op Android 4.4.
Deze app heeft geen activiteiten, dus schakel de selectie uit Activiteit maken en klik Af hebben.
Een zacht toetsenbord wordt beschouwd als een Input Method Editor (IME) door het Android-besturingssysteem. Een IME wordt aangegeven als een Service
in AndroidManifest.xml die de BIND_INPUT_METHOD
toestemming en reageert op de actie android.view.InputMethod
.
Voeg de volgende regels toe aan de toepassing
tag van het manifest:
De service
tag in het manifestbestand bevat een meta-data
tag die verwijst naar een genoemd XML-bestand method.xml. Zonder dit bestand herkent het Android-besturingssysteem onze Service
als een geldige IME-service. Het bestand bevat details over de invoermethode en zijn subtypen. Voor ons toetsenbord definiëren we een enkel subtype voor de nl locale. Maak de map aan res / xml als het niet bestaat, en voeg het bestand toe method.xml ernaar toe. De inhoud van het bestand zou moeten zijn:
De strings die deze app gebruikt zijn gedefinieerd in de res / waarden / strings.xml het dossier. We hebben drie snaren nodig:
Update uw strings.xml zodat het de volgende inhoud heeft:
SimpleKeyboard Eenvoudige IME Amerikaans Engels)
De lay-out van ons toetsenbord bevat alleen een KeyboardView
. De layout_alignParentBottom
attribuut is ingesteld op waar
zodat het toetsenbord onderaan het scherm verschijnt.
Maak een bestand met de naam res / lay-out / keyboard.xml en vervang de inhoud ervan door het volgende:
De keyPreviewLayout
is de lay-out van de pop-up met een korte levensduur die verschijnt wanneer een toets op het toetsenbord wordt ingedrukt. Het bevat een single Tekstweergave
. Maak een bestand met de naam res / lay-out / preview.xml en voeg het volgende toe:
De details van de toetsenbordtoetsen en hun posities worden gespecificeerd in een XML-bestand. Elke sleutel heeft de volgende kenmerken:
keyLabel
: Dit kenmerk bevat de tekst die op de sleutel wordt weergegeven.codes
: Dit kenmerk bevat de unicode-waarden van de tekens die de sleutel vertegenwoordigt.Bijvoorbeeld om een sleutel voor de letter te definiëren EEN, de codes
attribuut zou de waarde moeten hebben 97 en de keyLabel
attribuut moet worden ingesteld op EEN.
Als er meer dan één code aan een sleutel is gekoppeld, hangt het teken dat de sleutel vertegenwoordigt af van het aantal keren dat de sleutel wordt ontvangen. Bijvoorbeeld, als een sleutel de codes heeft 63, 33, en 58:
Een sleutel kan ook een paar optionele kenmerken hebben:
keyEdgeFlags
: Dit kenmerk kan de waarde aannemen links
of rechts
. Dit kenmerk wordt meestal toegevoegd aan de meest linkse en meest rechtse toetsen van een rij.keyWidth
: Dit kenmerk definieert de breedte van een sleutel. Het wordt meestal gedefinieerd als een percentage.isRepeatable
: Als dit kenmerk is ingesteld op waar
, door lang op de toets te drukken, herhaalt u de actie van de toets meerdere keren. Het is meestal ingesteld op waar
voor de toetsen delete en spatiebalk.De toetsen van een toetsenbord zijn gegroepeerd als rijen. Het is een goede gewoonte om het aantal toetsen op een rij te beperken tot een maximum van tien, waarbij elke toets een breedte heeft gelijk aan 10% van het toetsenbord. De hoogte van de toetsen is ingesteld op 60dp in deze tutorial. Deze waarde kan worden aangepast, maar waarden kleiner dan 48DP worden niet aanbevolen. Ons toetsenbord zal vijf rijen toetsen bevatten.
We kunnen nu doorgaan met het ontwerpen van het toetsenbord. Maak een nieuw bestand met de naam res / xml / qwerty.xml en vervang de inhoud ervan door het volgende:
U hebt misschien gemerkt dat sommige toetsen negatieve waarden hebben voor de codes
attribuut. Negatieve waarden zijn gelijk aan vooraf gedefinieerde constanten in de Toetsenbord
klasse. Bijvoorbeeld de waarde -5
is gelijk aan de waarde van Keyboard.KEYCODE_DELETE
.
Service
KlasseMaak een nieuwe Java-klasse en noem die SimpleIME.java. De klas zou moeten uitbreiden InputMethodService
class en implementeer de OnKeyboardActionListener
interface. De OnKeyboardActionListener
interface bevat de methoden die worden aangeroepen wanneer toetsen van het zachte toetsenbord worden aangetikt of ingedrukt.
De SimpleIME
klasse moet drie lidvariabelen hebben:
KeyboardView
verwijzend naar de weergave gedefinieerd in de lay-outToetsenbord
instantie die is toegewezen aan de KeyboardView
boolean
ons te vertellen of Caps Lock is ingeschakeldNa het declareren van deze variabelen en het toevoegen van de methoden van de OnKeyboardActionListener
interface, de SimpleIME
klasse zou er als volgt uit moeten zien:
public class SimpleIME breidt InputMethodService implementeert OnKeyboardActionListener private KeyboardView kv; privétoetsenbordtoetsenbord; private boolean caps = false; @Override public void onKey (int primaryCode, int [] keyCodes) @Override public void onPress (int primaryCode) @Override public void onRelease (int primaryCode) @Override public void onText (CharSequence-tekst) @ Negeer public void swipeDown () @Override public void swipeLeft () @Override public void swipeRight () @Override public void swipeUpUp ()
Wanneer het toetsenbord is gemaakt, is de onCreateInputView
methode wordt genoemd. Alle lidvariabelen van de Service
kan hier worden geïnitialiseerd. Update de implementatie van de onCreateInputView
methode zoals hieronder getoond:
@Override openbaar View onCreateInputView () kv = (KeyboardView) getLayoutInflater (). Inflate (R.layout.keyboard, null); toetsenbord = nieuw toetsenbord (dit, R.xml.qwerty); kv.setKeyboard (keyboard); kv.setOnKeyboardActionListener (deze); return kv;
Vervolgens maken we een methode die een geluid speelt wanneer een toets wordt ingedrukt. Wij gebruiken de AudioManager
klasse om de geluiden te spelen. De Android SDK bevat een paar standaard geluidseffecten voor het indrukken van toetsen en die worden gebruikt in de playClick
methode.
private void playClick (int keyCode) AudioManager am = (AudioManager) getSystemService (AUDIO_SERVICE); switch (keyCode) case 32: am.playSoundEffect (AudioManager.FX_KEYPRESS_SPACEBAR); breken; case Keyboard.KEYCODE_DONE: case 10: am.playSoundEffect (AudioManager.FX_KEYPRESS_RETURN); breken; case Keyboard.KEYCODE_DELETE: am.playSoundEffect (AudioManager.FX_KEYPRESS_DELETE); breken; standaard: am.playSoundEffect (AudioManager.FX_KEYPRESS_STANDARD);
Werk ten slotte het onKey
methode zodat onze toetsenbordapp kan communiceren met invoervelden (meestal Tekst bewerken
weergaven) van andere toepassingen.
De getCurrentInputConnection
methode wordt gebruikt om een verbinding te maken met het invoerveld van een andere toepassing. Zodra de verbinding tot stand is gebracht, kunnen we de volgende methoden gebruiken:
commitText
om een of meer tekens aan het invoerveld toe te voegendeleteSurroundingText
om een of meer tekens van het invoerveld te verwijderensendKeyEvent
om evenementen te verzenden, zoals KEYCODE_ENTER
, naar de externe applicatieTelkens wanneer een gebruiker op een toets op het toetsenbord drukt, wordt de onKey
methode wordt aangeroepen met de Unicode-waarde van de sleutel als een van de parameters. Op basis van deze waarde voert het toetsenbord een van de volgende acties uit:
KEYCODE_DELETE
, één teken links van de cursor wordt verwijderd met behulp van de deleteSurroundingText
methode.KEYCODE_DONE
, een KEYCODE_ENTER
belangrijke gebeurtenis is ontslagen.KEYCODE_SHIFT
, de waarde van de caps
variabele wordt gewijzigd en de schakeltoestand van het toetsenbord wordt bijgewerkt met behulp van de setShifted
methode. Het toetsenbord moet opnieuw worden getekend wanneer de status verandert, zodat de labels van de toetsen worden bijgewerkt. De invalidateAllKeys
methode wordt gebruikt om alle sleutels opnieuw te tekenen.caps
variabele is ingesteld op waar
, vervolgens wordt het teken omgezet in hoofdletters.Werk het onKey
methode zodat het er zo uitziet:
@Override public void onKey (int primaryCode, int [] keyCodes) InputConnection ic = getCurrentInputConnection (); playClick (primaryCode); switch (primaryCode) case Keyboard.KEYCODE_DELETE: ic.deleteSurroundingText (1, 0); breken; case Keyboard.KEYCODE_SHIFT: caps =! caps; keyboard.setShifted (caps); kv.invalidateAllKeys (); breken; case Keyboard.KEYCODE_DONE: ic.sendKeyEvent (nieuwe KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); breken; standaard: char code = (char) primaryCode; if (Character.isLetter (code) && caps) code = Character.toUpperCase (code); ic.commitText (String.valueOf (code), 1);
Het zachte toetsenbord is nu klaar om te worden getest. Compileer en voer het uit op een Android-apparaat. Deze app heeft geen Activiteit
, wat betekent dat het niet in de draagraket verschijnt. Om het te gebruiken, moet het eerst worden geactiveerd in het apparaat instellingen.
Na activering Eenvoudige IME, open een app die tekstinvoer toestaat (bijvoorbeeld een berichten-app) en klik op een van de invoervelden. Er zou een toetsenbordpictogram moeten verschijnen in het meldingengebied. Afhankelijk van uw apparaat kunt u op dat pictogram klikken of de meldingsbalk naar beneden slepen en selecteren Eenvoudige IME als de invoermethode. Je zou nu kunnen typen met je nieuwe toetsenbord.
In deze zelfstudie leert u hoe u vanuit het niets een aangepaste toetsenbord-app kunt maken. Om het uiterlijk en het gevoel van uw toetsenbord te veranderen, hoeft u alleen maar extra styling toe te voegen aan de res / lay-out / keyboard.xml en res / lay-out / preview.xml bestanden. Om de posities van de toetsen te wijzigen, werkt u de res / xml / qwerty.xml het dossier. Raadpleeg de documentatie voor de ontwikkelaar voor meer functies op uw toetsenbord.