Giriş yöntemi oluşturma

Giriş yöntemi düzenleyicisi (IME), kullanıcıların metin girmesine olanak tanıyan bir kullanıcı denetimidir. Android, uygulamaların kullanıcılara alternatif giriş yöntemleri sunmasını sağlayan genişletilebilir giriş yöntemi çerçevesi ekran klavyeleri veya konuşma girişi gibi. IME'leri yükledikten sonra kullanıcı ve bunu tüm sistemde kullanabilirsiniz. Aynı anda yalnızca bir IME etkinleştirilebilir.

Android sistemine IME eklemek için şu sınıfa sahip bir Android uygulaması oluşturun: uzatır InputMethodService Buna ek olarak, genellikle bir "ayarlar" iME hizmetine seçenekler ileten etkinliktir. Siz sistem ayarlarının parçası olarak görüntülenen bir ayarlar kullanıcı arayüzü de tanımlayabilir.

Bu sayfada aşağıdaki konular ele alınmaktadır:

Daha önce IME'lerle çalışmadıysanız tanıtım makalesini okuyun. Ekrandaki Giriş Yöntemleri tıklayın.

IME yaşam döngüsü

Aşağıdaki şemada bir IME'nin yaşam döngüsü açıklanmaktadır:

Bir IME'nin yaşam döngüsünü gösteren resim.
Şekil 1. IME'nin yaşam döngüsü.

Aşağıdaki bölümlerde, kullanıcı arayüzünün bu yaşam döngüsünü izler.

Manifest'te IME bileşenlerini bildir

Android sisteminde IME, özel bir IME hizmeti içeren Android uygulamasıdır. İlgili içeriği oluşturmak için kullanılan uygulamasının manifest dosyasında hizmeti beyan etmeli, gerekli izinleri istemeli, action.view.InputMethod işlemiyle eşleşen ve meta veriler sağlayan intent filtresi IME'nin özelliklerini tanımlayan bir ifadedir. Ayrıca, IME davranışını değiştirmesi için bir "ayarlar" başlatılması veya Sistem Ayarları.

Aşağıdaki snippet bir IME hizmetini tanımlar. İzin istiyor BIND_INPUT_METHOD. hizmetin IME'yi sisteme bağlamasını sağlamak için, işlemle eşleşen bir intent filtresi oluşturur. android.view.InputMethod değerini alır ve IME'nin meta verilerini tanımlar:

<!-- Declares the input method service. -->
<service android:name="FastInputIME"
    android:label="@string/fast_input_label"
    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>

Sonraki snippet, IME için ayar etkinliğini açıklar. Şunun için bir intent filtresine sahiptir: ACTION_MAIN bu etkinliğin IME uygulaması için ana giriş noktası olduğunu gösterir:

<!-- Optional: an activity for controlling the IME settings. -->
<activity android:name="FastInputIMESettings"
    android:label="@string/fast_input_settings">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
    </intent-filter>
</activity>

Ayrıca, doğrudan IME'nin kullanıcı arayüzünden IME'nin ayarlarına erişim sağlayabilirsiniz.

Giriş yöntemi API'si

IME'lere özel sınıflar android.inputmethodservice. ve android.view.inputmethod paketlerini ekleyebilirsiniz. KeyEvent sınıfı çok önemlidir.

Bir IME'nin merkezi bölümü bir hizmet bileşenidir. InputMethodService Bu, normal hizmet yaşam döngüsünü uygulamanın yanı sıra class'ta IME'nizin kullanıcı arayüzünü sağlamak, kullanıcı girişini yönetmek ve bir alandır. Varsayılan olarak InputMethodService sınıfı, IME'nin durumunu ve görünürlüğünü yönetmek ve mevcut müşteri temsilcisiyle iletişim kurmak için giriş alanına ekleyebilirsiniz.

Aşağıdaki sınıflar da önemlidir:

BaseInputConnection
. Bir ağdan iletişim kanalını tanımlar InputMethod alan uygulamaya geri dönmesini sağlar. Arka plandaki yazıları okumak için imleç, metin kutusuna metin kaydetme ve ham önemli etkinlikleri uygulamaya gönderme. Uygulamalar, temel arayüzü uygulamak yerine bu sınıfı genişletmelidir InputConnection
KeyboardView
. View uzantısı bir klavye oluşturur ve kullanıcı girişi etkinliklerine yanıt verir. Klavye düzeni bir şunun örneği: Keyboard, (XML dosyasında tanımlayabileceğiniz)

Giriş yöntemi kullanıcı arayüzünü tasarlama

IME'nin iki ana görsel öğesi vardır: input görünümü ve candidates görünümünü sunar. Yalnızca işletmenizle alakalı öğeleri uygulamanız gerekir. giriş yöntemini kullanabilirsiniz.

Giriş görünümü

Giriş görünümü, kullanıcının tuşa tıklama, el yazısı veya hareketler. IME ilk kez görüntülendiğinde sistem onCreateInputView(). geri arama. Bu yöntemi uygularken IME'de görüntülenmesini istediğiniz düzeni oluşturun pencereye alın ve düzeni sisteme geri döndürün. Aşağıdaki snippet, Google Etiket Yöneticisi'ni kullanarak onCreateInputView() yöntemi:

Kotlin

override fun onCreateInputView(): View {
    return layoutInflater.inflate(R.layout.input, null).apply {
        if (this is MyKeyboardView) {
            setOnKeyboardActionListener(this@MyInputMethod)
            keyboard = latinKeyboard
        }
    }
}

Java

@Override
public View onCreateInputView() {
    MyKeyboardView inputView =
        (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null);

    inputView.setOnKeyboardActionListener(this);
    inputView.setKeyboard(latinKeyboard);

    return inputView;
}

Bu örnekte, MyKeyboardView özel bir uygulamanın bir örneğidir: Keyboard oluşturan KeyboardView.

Aday görünümü

Adaylar görünümü, IME'nin olası kelime düzeltmelerini veya önerileri gösterdiği kullanıcı arayüzüdür kullanıcının seçmesi için bir fırsattır. IME yaşam döngüsünde sistem, onCreateCandidatesView(). hazır olduğunda adaylar görünümünü Bu yöntemi uygulamanızda kelime önerileri gösteren bir düzen seçin veya herhangi bir şey göstermek istemiyorsanız null değerini döndürün. Boş yanıtı varsayılan davranıştır; bu nedenle öneriler.

Kullanıcı arayüzü tasarımında dikkat edilmesi gereken noktalar

Bu bölümde, IME'ler için kullanıcı arayüzü tasarımıyla ilgili dikkate alınması gereken bazı noktalar açıklanmaktadır.

Birden fazla ekran boyutunu yönetme

IME'nizin kullanıcı arayüzünün, farklı ekran boyutlarına göre ölçeklendirilebilmesi ve her iki yatay ekranı işleyebilmesi gerekir. bir arada kullanabilirsiniz. Tam ekran olmayan IME modunda, uygulamanın metin alanını ve içerikle ilişkili bağlamı göstererek ekranın yarısından fazlasını IME'yi seçin. Tam ekran IME modunda bu bir sorun değildir.

Farklı giriş türlerini işleyin

Android metin alanları serbest biçimli metin, sayı, URL vb. gibi belirli giriş türlerini ayarlamanıza olanak tanır. ve arama dizeleri dahil edilir. Yeni bir IME uyguladığınızda her bir IME'nin giriş türünü alanına girin ve bunun için uygun arayüzü sağlayın. Ancak, IME'nizi kullanıcının giriş türü için geçerli metin girip girmediğini kontrol eder. Bu, bir uygulamadır.

Örneğin, Latince IME'nin Android platformu metni için sağladığı arayüz aşağıda verilmiştir: giriş:

Latince IME üzerinde metin girişini gösteren resim
Şekil 2. Latince IME metin girişi.

Burada da, Latince IME'nin, Android platformu için sağladığı sayısal giriş:

Latince IME üzerinde sayısal bir giriş gösteren resim
Şekil 3. Latince IME sayısal girişi.

Bir giriş alanına odaklanıldığında ve IME'niz başladığında sistem onStartInputView(), bir EditorInfo nesne giriş türü ve metin alanının diğer özellikleriyle ilgili ayrıntıları içeren bir sayfadır. Bu nesnede, "the" inputType. alanı, metin alanının giriş türünü içerir.

inputType alanı, çeşitli öğeler için bit kalıpları içeren bir int giriş türü ayarlarına gidin. Bunu metin alanının giriş türüne göre test etmek için, sabit değer ile maskeleyin TYPE_MASK_CLASS, aşağıdaki gibidir:

Kotlin

inputType and InputType.TYPE_MASK_CLASS

Java

inputType & InputType.TYPE_MASK_CLASS

Giriş türü bit kalıbı, aşağıdakiler dahil çeşitli değerlerden birine sahip olabilir:

TYPE_CLASS_NUMBER
Rakamları girmek için kullanılan bir metin alanı. Şekil 3'te gösterildiği gibi, Latince IME'de bir sayı tuşlarını kullanın.
TYPE_CLASS_DATETIME
Tarih ve saat girmek için bir metin alanı.
TYPE_CLASS_PHONE
Telefon numaralarını girmek için bir metin alanı.
TYPE_CLASS_TEXT
Desteklenen karakterleri girebileceğiniz bir metin alanı.

Bu sabit değerler, kullanılan referans belgelerinde daha ayrıntılı olarak açıklanmıştır: InputType

inputType alanı, metin alanının varyantını belirten başka bitler içerebilir Örneğin:

TYPE_TEXT_VARIATION_PASSWORD
Şifre girmek için TYPE_CLASS_TEXT varyantı. Giriş yöntemi, dingbat'lar oluşturabilirsiniz.
TYPE_TEXT_VARIATION_URI
Web URL'lerini ve diğer Tekdüzen Kaynakları girmek için TYPE_CLASS_TEXT varyantı Tanımlayıcılar (URI).
TYPE_TEXT_FLAG_AUTO_COMPLETE
Uygulamanın istediği metni girmek içinTYPE_CLASS_TEXT değişkeni Bir sözlükten, aramadan veya başka bir özellikten otomatik olarak tamamlar.

Bu varyantları test ederken inputType öğesini uygun sabitle maskeleyin. İlgili içeriği oluşturmak için kullanılan kullanılabilir maske sabit değerleri, InputType referans belgelerinde listelenmiştir.

Uygulamaya kısa mesaj gönder

Kullanıcı IME'nizle metin girerken, IME'nizi tek tek göndererek uygulamaya metin gönderebilirsiniz veya uygulamanın metin alanında imlecin etrafındaki metni düzenleyerek önemli etkinlikleri sağlayabilirsiniz. Her iki durumda da, Metni iletmek için InputConnection örneğini kullanın. Bu örneği almak için şunu arayın: InputMethodService.getCurrentInputConnection()

İmlecin etrafındaki metni düzenleme

Mevcut metinleri düzenlerken, BaseInputConnection şunlardır:

getTextBeforeCursor()
CharSequence döndürür , geçerli imleç konumundan önceki istenen karakter sayısını içerir.
getTextAfterCursor()
Aşağıdakilerden sonra istenen karakterlerin sayısını içeren bir CharSequence döndürür: imlecin bulunduğu konuma getirin.
deleteSurroundingText()
Geçerli imleç konumundan önce ve sonra belirtilen sayıda karakteri siler.
commitText()
Metin alanına bir CharSequence kaydeder ve yeni bir imleç konumu ayarlar.

Örneğin, aşağıdaki snippet'te "Hello!" ifadesini içeren bir imleç:

Kotlin

currentInputConnection.also { ic: InputConnection ->
    ic.deleteSurroundingText(4, 0)
    ic.commitText("Hello", 1)
    ic.commitText("!", 1)
}

Java

InputConnection ic = getCurrentInputConnection();
ic.deleteSurroundingText(4, 0);
ic.commitText("Hello", 1);
ic.commitText("!", 1);

Kaydetmeden önce metin oluşturmayı destekleyin

IME'niz metni tahmin ediyorsa veya bir glif ya da kelime oluşturmak için birden fazla adım gerektiriyorsa devam edin. Kullanıcı kelimeyi kaydedene kadar, yerine kısmi kompozisyonu oluşturun. Örneğin, span setComposingText().

Aşağıdaki snippet'te, bir metin alanında ilerleme durumunun nasıl gösterileceği gösterilmektedir:

Kotlin

currentInputConnection.also { ic: InputConnection ->
    ic.setComposingText("Composi", 1)
    ic.setComposingText("Composin", 1)
    ic.commitText("Composing ", 1)
}

Java

InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
ic.setComposingText("Composin", 1);
ic.commitText("Composing ", 1);

Donanımla ilgili önemli etkinlikleri engelleme

Giriş yöntemi penceresinde belirgin bir odağı olmasa da donanımla ilgili önemli etkinlikler alır önce tüketebilir veya uygulamaya yönlendirebilir. Örneğin, ekip arkadaşlarınızın kullanıcı arayüzünüz içinde gezinmek için yön tuşlarını kullanın. Giriş yönteminden kaynaklanan iletişim kutularını kapatmak için geri tuşunu da yakalamanız önerilir. penceresini kapatın.

Donanım anahtarlarına müdahale etmek için onKeyDown(). ve onKeyUp().

Kendiniz kullanmak istemediğiniz anahtarlar için super() yöntemini çağırın.

IME alt türü oluşturma

Alt türler, IME'nin birden fazla giriş modunu ve IME tarafından desteklenen dilleri göstermesine olanak tanır. Alt tür aşağıdakileri temsil eder:

  • en_US veya fr_FR gibi bir yerel ayar
  • Ses, klavye veya el yazısı gibi bir giriş modu
  • 10 tuşlu veya QWERTY gibi IME'ye özgü diğer giriş stilleri, formları veya özellikleri klavye düzenleri

Mod, "klavye" gibi herhangi bir metin olabilir veya "ses"le başlayın. Bir alt tür, bir kombinasyonun da gösterilmesini sağlayabilir sayabiliriz.

Alt tür bilgileri, bildirim çubuğundan ulaşılabilen bir IME değiştirici iletişim kutusu için kullanılır ve IME ayarları için geçerlidir. Bu bilgiler, çerçevenin bir IME'nin belirli bir alt türünü ortaya çıkarmasına da olanak tanır. doğrudan ekleyebilirsiniz. IME oluşturduğunuzda, alt tür olanağını kullanın. Çünkü bu, kullanıcının kimliğini belirleyip farklı IME dilleri ve modları arasında geçiş yapabilirsiniz.

Aşağıdaki kodu kullanarak giriş yönteminin XML kaynak dosyalarından birinde alt türleri tanımlayın: <subtype> öğesi. Aşağıdaki kod snippet'i iki alt türü olan bir IME'yi tanımlar: ABD İngilizcesi yerel ayarı için klavye alt türü ve Fransızca için başka bir klavye alt türü Fransa için yerel ayar:

<input-method xmlns:android="http://schemas.android.com/apk/res/android"
        android:settingsActivity="com.example.softkeyboard.Settings"
        android:icon="@drawable/ime_icon">
    <subtype android:name="@string/display_name_english_keyboard_ime"
            android:icon="@drawable/subtype_icon_english_keyboard_ime"
            android:languageTag="en-US"
            android:imeSubtypeMode="keyboard"
            android:imeSubtypeExtraValue="somePrivateOption=true" />
    <subtype android:name="@string/display_name_french_keyboard_ime"
            android:icon="@drawable/subtype_icon_french_keyboard_ime"
            android:languageTag="fr-FR"
            android:imeSubtypeMode="keyboard"
            android:imeSubtypeExtraValue="someVariable=30,someInternalOption=false" />
    <subtype android:name="@string/display_name_german_keyboard_ime" ... />
</input-method>

Alt türlerinizin kullanıcı arayüzünde doğru şekilde etiketlendiğinden emin olmak için "%s" işlevini kullanarak alt türün yerel ayar etiketiyle aynıdır. Bu, sonraki iki kod snippet'inde gösterilmektedir. İlgili içeriği oluşturmak için kullanılan ilk snippet, giriş yönteminin XML dosyasının bir kısmını gösterir:

<subtype
    android:label="@string/label_subtype_generic"
    android:imeSubtypeLocale="en_US"
    android:icon="@drawable/icon_en_us"
    android:imeSubtypeMode="keyboard" />

Sonraki snippet, IME'nin strings.xml dosyasının bir parçasıdır. Dize kaynağı label_subtype_generic (Bu, alt türün etiketi aşağıdaki gibi tanımlanır:

<string name="label_subtype_generic">%s</string>

Bu ayar, alt türün görünen adının yerel ayarla eşleşmesine neden olur. Örneğin, İngilizce yerel ayar, görünen ad "İngilizce (ABD)"dir.

Bildirim çubuğundan IME alt türlerini seçin

Android sistemi, tüm IME'ler tarafından gösterilen tüm alt türleri yönetir. IME alt türleri, Ait olduğu IME'yi gösterir. Kullanıcı, bildirim çubuğundan veya Ayarlar uygulamasından bir aşağıda gösterildiği gibi kullanılabilir IME alt türlerinin yer aldığı menü:

Diller ve giriş sistem menüsü
Şekil 4. Diller ve giriş sistem menüsüne gidin.

Sistem Ayarları'ndan IME alt türlerini seçin

Kullanıcı, alt türlerin nasıl kullanıldığını da Dil ve giriş ayarları paneli girin:

Diller seçim menüsünü gösteren resim
Şekil 5. Diller sistem menüsü

IME alt türleri arasında geçiş yapma

Örneğin yerküre şeklinde dil simgesine dokunun. Bu, klavyenin kullanılabilirliğini artırır ve kullanışlı olur temsil eder. Bu geçişi etkinleştirmek için aşağıdaki adımları uygulayın:

  1. Giriş yönteminin XML'inde supportsSwitchingToNextInputMethod = "true" öğesini bildir kaynak dosyalar. Beyanınız aşağıdaki kod snippet'ine benzer olmalıdır:
    <input-method xmlns:android="http://schemas.android.com/apk/res/android"
            android:settingsActivity="com.example.softkeyboard.Settings"
            android:icon="@drawable/ime_icon"
            android:supportsSwitchingToNextInputMethod="true">
    
  2. Şunu çağırın: shouldOfferSwitchingToNextInputMethod(). yöntemidir.
  3. Yöntem true değerini döndürürse bir geçiş anahtarı görüntüleyin.
  4. Kullanıcı geçiş tuşuna dokunduğunda şunu ara: switchToNextInputMethod(), iletebilir. False (yanlış) değeri, sisteme ne olursa olsun tüm alt türleri eşit şekilde Ait olduğu IME'yi gösterebilirsiniz. Doğru değerini belirlemek için sistemin görebilirsiniz.

IME ile ilgili dikkat edilmesi gereken genel noktalar

IME'nizi uygularken göz önünde bulundurmanız gereken diğer noktalar şunlardır:

  • Kullanıcılara, seçenekleri doğrudan IME'nin kullanıcı arayüzünden ayarlama olanağı sunun.
  • Kullanıcıların, giriş yönteminin kullanıcı arayüzünden doğrudan farklı bir IME'ye geçiş yapması için bir yol sağlayın. çünkü cihazda birden fazla IME yüklü olabilir.
  • IME'nin kullanıcı arayüzünü hızlı bir şekilde açın. Büyük kaynakları istediğiniz zaman önceden yükleyerek veya yükleyerek bir metin alanına dokunur dokunmaz IME'yi görebilir. Daha sonrası için kaynakları ve görünümleri önbelleğe alın çağrılarına karşılık gelir.
  • Büyük bellek ayırmalarını giriş yöntemi penceresi gizlendikten hemen sonra serbest bırakın. yeterli belleğe sahip olduğundan emin olmanız gerekir. Kaynakları serbest bırakmak için geciken bir mesaj kullanın birkaç saniye boyunca gizlenecek.
  • Kullanıcıların dil veya yerel ayar için mümkün olduğunca fazla karakter girebildiğinden emin olun IME ile ilişkilendirilmiştir. Kullanıcılar, şifrelerinde veya kullanıcı adlarında noktalama işareti kullanıyor olabilir. Bu nedenle, IME'niz kullanıcıların şifre girmelerine ve web'e erişmelerine izin vermek için olanak tanır.