Opprette en egendefinert tastatur på Android

Create A Custom Keyboard på Android

76
Del
25
Del
Dette Cyber ​​mandag Envato Tuts + Kursene vil bli redusert til bare $ 3. Ikke gå glipp av.
Hva du skal lage

De fleste Android-enheter ikke har et fysisk tastatur. I stedet, de er avhengige av en virtuell eller skjermtastaturet for å godta brukerundersøkelser. Hvis du er i Android tilpassing, og vite hvordan du kan bygge en tilpasset, kan myke tastaturet ta din hobby til et helt nytt nivå.

Ved hjelp av Android SDK, kan du raskt lage en myk tastatur med overraskende få linjer med kode, fordi SDK tar seg av mange av de lave nivå oppgaver, for eksempel å gjenkjenne viktige innslag, tegning tastaturet, og etablere forbindelser mellom tastatur og inntastingsfelt.
I denne opplæringen, du vil lære å skape en fullt funksjonell soft-tastatur som kan fungere som din Android-enhet standardtastaturet.

1. Forutsetninger

Du trenger Eclipse ADT Bundle installert. Du kan laste det ned fra Android Developer nettstedet.

2. Opprett et nytt prosjekt

Fyr opp Eclipse og opprette en ny Android-applikasjon. Kalle dette programmet, SimpleKeyboard. Pass på at du velger et unikt pakkenavn. Sett minstekravet SDK til Android 2.2 og sette mål SDK til Android 4.4.

Denne applikasjonen vil ikke ha noen aktiviteter så fjern markeringen skape aktivitet og klikk Fullfør.

3. Redigere Manifest

En myk tastatur er regnet som en Input Method Editor (IME) ved operativsystemet Android. En IME er erklært som en tjeneste i AndroidManifest.xml som bruker BIND_INPUT_METHOD tillatelse, og reagerer på handlingen android.view.InputMethod

Legg til følgende linjer i søknaden tag av manifestet. < ". SimpleIME":; br> < tjeneste android name = android: label = "@ streng /simple_ime" android: tillatelse = "android.permission.BIND_INPUT_METHOD" > < meta-data android: name = "android.view.im" android: ressurs = "@ xml /metode" /> < intent-filter > < handling android: name = "android.view.InputMethod" /> < /intent-filter > < /tjenesten >
4. Opprett method.xml

Tjenesten tag i manifestfilen containes en meta-data tag som refererer til en XML-fil som heter method.xml. Uten denne filen, vil Android-operativsystemet ikke gjenkjenner vår service som en gyldig IME service. Filen inneholder informasjon om input metoden og dens undergrupper. For vår tastatur, definerer vi et enkelt subtype for no locale. Katalogen opprettes res /xml hvis den ikke eksisterer, og legge til filen method.xml til det. Innholdet i filen skal være:?
≪ xml version = "1.0" encoding = "UTF-8" > < u-metoden xmlns:? Android = "http://schemas.android.com/apk /res /android "> < subtype android: label = "@ streng /subtype_en_US" android: imeSubtypeLocale = "no" android: imeSubtypeMode = "keyboard" /> < /input-metode >
5. Edit strings.xml

Strenger at dette programmet bruker er definert i res /verdier /strings.xml fil. Vi kommer til å trenge tre strenger:

navnet på app

etiketten på IME

etiketten på IME er subtype < .no>

Oppdater strings.xml slik at den har følgende innhold:
< ressurser > < string name = "APP_NAME" > SimpleKeyboard < /string > < string name = "simple_ime" > Simple IME < /string > < string name = "subtype_en_US" > English (US) < /string > < /ressurser >
6. Definere tastaturoppsett

Utformingen av vår tastaturet inneholder kun en KeyboardView. Den layout_alignParentBottom attributt er satt til true, slik at tastaturet vises nederst på skjermen

Lag en fil som heter res /layout /keyboard.xml og erstatte innholdet med følgende:.
&Lt ??; xml version = "1.0" encoding = "UTF-8" > < android.inputmethodservice.KeyboardView xmlns: android = "http://schemas.android.com/apk/res/android" android: id = "+ id /keyboard" android: layout_width = "match_parent" android: layout_height = "wrap_content" android: layout_alignParentBottom = "true" android: keyPreviewLayout = "@ layout /preview" />

keyPreviewLayout er utformingen av kortvarig pop-up som dukker opp når en tast på tastaturet trykkes. Den inneholder en enkelt TextView. Lag en fil som heter res /layout /preview.xml og legg følgende til det:?
≪ 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: vekt =" center "android: bakgrunn =" # FFFF00 "android: textStyle =" bold " android: Tekststørrelse = "30sp" > < /TextView >
6. Definer Keyboard Keys

Detaljene tastaturtastene og deres posisjoner er spesifisert i en XML-fil. Hver tast har følgende egenskaper:

keyLabel. Dette attributtet inneholder teksten som vises på tasten

koder: Dette attributtet inneholder Unicode-verdier av tegnene på at nøkkelen representerer.

For eksempel, for å definere en nøkkel for bokstaven A, kodene tilskriver bør ha verdien 97 og keyLabel attributtet skal settes til A.

Hvis mer enn en kode er forbundet med en nøkkel, og deretter tegnet som representerer nøkkel vil avhenge av antallet av uttak på tasten mottar. For eksempel, hvis en nøkkel har kodene 63, 33 og 58:?

  • et enkelt trykk på de viktigste resultatene i karakter

    to kraner i rask rekkefølge resultater i karakter

    tre kraner i rask rekkefølge resultater i karakter:!

    En nøkkel kan også ha et par valgfrie attributter:

    keyEdgeFlags: Dette attributtet kan ta verdien til venstre eller høyre. Dette attributtet er vanligvis lagt til den nest siste og lengst til høyre nøkler rad

    keyWidth. Dette attributtet definerer bredden på en tast. Det er vanligvis definert som en prosentverdi

    isRepeatable. Hvis dette attributtet er satt til sann, lang trykke på tasten vil gjenta handlingen av nøkkel flere ganger. Det er vanligvis satt til true for slette og mellomromstasten tastene.

    Tastene av et tastatur er gruppert som rader. Det er god praksis å begrense antallet av taster på en rad til et maksimum på ti, med hver tast har en bredde lik 10% av tastaturet. Høyden på tastene er satt til 60dp i denne opplæringen. Denne verdien kan justeres, men verdier som er mindre enn 48dp anbefales ikke. Vår tastatur vil ha fem rader med taster.

    Vi kan nå gå videre og utforme tastaturet. Opprett en ny fil med navnet res /xml /qwerty.xml og erstatte innholdet med følgende:
    < Tastatur xmlns: android = "http://schemas.android.com/apk/res/android" android: keyWidth = "10% p" android: horizontalGap = "0px" android: verticalGap = "0px" android: keyHeight = "60dp" > < Row > < Nøkkel android: koder = "49" android: keyLabel = "1" android: keyEdgeFlags = "left" /> < Nøkkel android: koder = "50" android: keyLabel = "2" /> < Nøkkel android: koder = "51" android: keyLabel = "3" /> < Nøkkel android: koder = "52" android: keyLabel = "4" /​​> < Nøkkel android: koder = "53" android: keyLabel = "5" /> < Nøkkel android: koder = "54" android: keyLabel = "6" /> < Nøkkel android: koder = "55" android: keyLabel = "7" /> < Nøkkel android: koder = "56" android: keyLabel = "8" /> < Nøkkel android: koder = "57" android: keyLabel = "9" /> < Nøkkel android: koder = "48" android: keyLabel = "0" Android: keyEdgeFlags = "right" /> < /Row > < Row > < Nøkkel android: koder = "113" android: keyLabel = "Q" android: keyEdgeFlags = "left" /> < Nøkkel android: koder = "119" android: keyLabel = "w" /> < Nøkkel android: koder = "101" android: keyLabel = "e" /> < Nøkkel android: koder = "114" android: keyLabel = "r" /> < Nøkkel android: koder = "116" android: keyLabel = "t" /> < Nøkkel android: koder = "121" android: keyLabel = "y" /> < Nøkkel android: koder = "117" android: keyLabel = "u" /> < Nøkkel android: koder = "105" android: keyLabel = "i" /> < Nøkkel android: koder = "111" android: keyLabel = "o" /> < Nøkkel android: koder = "112" android: keyLabel = "p" Android: keyEdgeFlags = "right" /> < /Row > < Row > < Nøkkel android: koder = "97" android: keyLabel = "a" android: keyEdgeFlags = "left" /> < Nøkkel android: koder = "115" android: keyLabel = "s" /> < Nøkkel android: koder = "100" android: keyLabel = "d" /> < Nøkkel android: koder = "102" android: keyLabel = "f" /> < Nøkkel android: koder = "103" android: keyLabel = "g" /> < Nøkkel android: koder = "104" android: keyLabel = "h" /> < Nøkkel android: koder = "106" android: keyLabel = "j" /> < Nøkkel android: koder = "107" android: keyLabel = "k" /> < Nøkkel android: koder = "108" android: keyLabel = "l" /> < Nøkkel android: koder = "35,64" android: keyLabel = "\\ # \\ @" android: keyEdgeFlags = "right" /> < /Row > < Row > < Key android: koder = "- 1" android: keyLabel = "caps" android: keyEdgeFlags = "left" /> < Nøkkel android: koder = "122" android: keyLabel = "z" /> < Nøkkel android: koder = "120" android: keyLabel = "x" /> < Nøkkel android: koder = "99" android: keyLabel = "c" /> < Nøkkel android: koder = "118" android: keyLabel = "v" /> < Nøkkel android: koder = "98" android: keyLabel = "b" /> < Nøkkel android: koder = "110" android: keyLabel = "n" /> < Nøkkel android: koder = "109" android: keyLabel = "m" /> < Nøkkel android: koder = "46" android: "." keyLabel = /> < Nøkkel android: koder = "63,33,58" android: keyLabel = "\\:?!" android: keyEdgeFlags = "right" /> < /Row > < Row android: rowEdgeFlags = "bunnen" > < Nøkkel android: koder = "44" android: keyLabel = "," android: keyWidth = "10% p" android: keyEdgeFlags = "left" /> < Nøkkel android: koder = "47" android: keyLabel = "/" android: keyWidth = "10% p" /> < Nøkkel android: koder = "32" android: keyLabel = "SPACE" android: keyWidth = "40% p" android: isRepeatable = "true" /> < Key android: koder = "- 5" android: keyLabel = "DEL" android: keyWidth = "20% p" android: isRepeatable = "true" /> < Key android: koder = "- 4" android: keyLabel = "FERDIG" android: keyWidth = "20% p" android: keyEdgeFlags = "right" /> < /Row > < /Keyboard >

    Du har kanskje lagt merke til at enkelte taster har negative verdier for å få kodene attributtet. Negative verdier er lik forhåndsdefinerte konstanter i Keyboard klassen. For eksempel er verdien -5 lik verdien av Keyboard.KEYCODE_DELETE.

    7. Opprette en service Class

    Opprett en ny Java-klassen og kaller det SimpleIME.java. Klassen bør utvide InputMethodService klasse og implementere OnKeyboardActionListener grensesnittet. Den OnKeyboardActionListener grensesnittet inneholder metodene som kalles når tastene på skjermtastaturet er tappet eller presset

    SimpleIME klasse skal ha tre medlemsvariabler.

  • a KeyboardView henvisning visningen definert i oppsettet

    a Keyboard eksempel som er tildelt den KeyboardView

    en boolsk fortelle oss om Caps Lock er aktivert

    Etter å erklære disse variablene og legge til metoder for OnKeyboardActionListener grensesnittet, bør SimpleIME klassen se slik ut:
    public class SimpleIME strekker InputMethodService implementerer OnKeyboardActionListener {private KeyboardView kv; private Keyboard tastatur; 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) {} @ styre public void swipeDown () {}Override public void swipeLeft () {}Override public void swipeRight () {}Override public void swipeUp () {}}

    Når tastaturet er opprettet, onCreateInputView metoden kalles . Alle medlemsvariabler av tjenesten kan initialisert her. Oppdater gjennomføringen av onCreateInputView metoden som vist nedenfor.
    Overridepublic Vis onCreateInputView () {kv = (KeyboardView) getLayoutInflater () blåse (R.layout.keyboard, null); tastatur = new Keyboard (dette, R.xml.qwerty); kv.setKeyboard (keyboard); kv.setOnKeyboardActionListener (denne); returnere kv;}

    Deretter oppretter vi en metode som spiller en lyd når du trykker en tast. Vi bruker Lydbehandling klasse å spille lydene. Android SDK inneholder noen standard lydeffekter for tastetrykk og de brukes i playClick metoden
    private void playClick (int keycode) {Lydbehandling am = (Lydbehandling) getSystemService (AUDIO_SERVICE.); bryteren (keycode) {case 32: am.playSoundEffect (AudioManager.FX_KEYPRESS_SPACEBAR); gå i stykker; case Keyboard.KEYCODE_DONE: case 10: am.playSoundEffect (AudioManager.FX_KEYPRESS_RETURN); gå i stykker; case Keyboard.KEYCODE_DELETE: am.playSoundEffect (AudioManager.FX_KEYPRESS_DELETE); gå i stykker; Standard: am.playSoundEffect (AudioManager.FX_KEYPRESS_STANDARD); }}

    Til slutt oppdatere onkey metode, slik at våre tastatur app kan kommunisere med input felt (vanligvis EditText visninger) av andre programmer.

    getCurrentInputConnection metoden brukes til å få en forbindelse til input-feltet av et annet program. Når vi har tilkoblingen, kan vi bruke følgende metoder:

    commitText å legge til ett eller flere tegn til inntastingsfeltet

    deleteSurroundingText å slette ett eller flere tegn i tekstfeltet

    sendKeyEvent å sende hendelser, som KEYCODE_ENTER, til eksternt program

    Når en bruker trykker på en tast på skjermtastaturet, er onkey metode som kalles med unicode verdien av nøkkelen som en av parametrene. Basert på denne verdien, utfører tastaturet en av følgende handlinger:.

  • Hvis koden er KEYCODE_DELETE, er ett tegn til venstre for markøren slettet bruker deleteSurroundingText metoden

    Dersom koden er KEYCODE_DONE, er en KEYCODE_ENTER viktig begivenhet sparken.

    Dersom koden er KEYCODE_SHIFT, verdien av caps variable er endret og skiftet tilstand av tastaturet er oppdatert med setShifted metoden. Tastaturet må tegnes på nytt når de statlige endringer slik at etikettene av tastene er oppdatert. Den invalidateAllKeys metoden brukes til å tegne alle tastene.
  • For alle andre koder, er koden bare omgjort til en karakter og sendt til inntastingsfeltet. Hvis koden representerer en bokstav i alfabetet og caps variabelen er satt til sann, deretter tegnet er konvertert til store bokstaver

    Oppdater onkey metode, slik at det ser slik ut:.
    @ Overridepublic void onkey (int primaryCode, int [] keycodes) {InputConnection ic = getCurrentInputConnection (); playClick (primaryCode); bryteren (primaryCode) {case Keyboard.KEYCODE_DELETE: ic.deleteSurroundingText (1, 0); gå i stykker; case Keyboard.KEYCODE_SHIFT: caps = caps; keyboard.setShifted (caps); kv.invalidateAllKeys (); gå i stykker; case Keyboard.KEYCODE_DONE: ic.sendKeyEvent (ny KeyEvent (KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); gå i stykker; standard: char code = (char) primaryCode; if (Character.isLetter (kode) & & caps) {kode = Character.toUpperCase (kode); } Ic.commitText (String.valueOf (kode), 1); }}
    8. Teste Keyboard

    Skjermtastaturet er nå klar til å bli testet. Kompilere og kjøre den på en Android-enhet. Dette programmet har ikke en aktivitet, noe som betyr at det ikke vil dukke opp i bærerakett. For å bruke det, bør den først aktiveres i enhetens innstillinger.

    Etter aktivering Simple IME, åpne en app som lar ordbok (for eksempel noen messaging app) og klikk på en av sine innspill felt. Du skal se et tastaturikon vises i varslingsområdet. Avhengig av enheten, kan du enten klikke på det ikonet eller drar varslingslinjen ned og velg Simple IME som inngangsmetode. Du skal nå kunne skrive ved hjelp din nye tastaturet.

    Konklusjon

    I denne opplæringen, har du lært hvordan du oppretter en egendefinert tastatur app fra bunnen av. Hvis du vil endre utseendet på tastaturet, er alt du trenger å gjøre er å legge ekstra styling til res /layout /keyboard.xml og res /layout /preview.xml filer. Hvis du vil endre plasseringen av tastene, oppdatere res /xml /qwerty.xml fil. Hvis du vil legge til flere funksjoner i tastaturet, kan du se dokumentasjonen utbygger.