Uygulamanızı otomatik doldurma için optimize etme

Standart görünümleri kullanan uygulamalar, özel yapılandırma gerektirmeden otomatik doldurma çerçevesiyle çalışır. Ayrıca uygulamanızın çerçeveyle çalışma şeklini optimize edebilirsiniz.

Otomatik doldurma ortamını ayarlama

Bu bölümde, uygulamanız için temel otomatik doldurma işlevini nasıl ayarlayacağınız açıklanmaktadır.

Otomatik doldurma hizmeti yapılandırma

Uygulamanızın otomatik doldurma çerçevesini kullanması için cihazınızda bir otomatik doldurma hizmeti yapılandırılmalıdır. Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran çoğu telefon ve tablet otomatik doldurma hizmetiyle gelse de, uygulamanızı test ederken Android otomatik doldurma çerçevesi örneğindeki otomatik doldurma hizmeti gibi bir test hizmeti kullanmanızı öneririz. Bir emülatör kullanırken açıkça bir otomatik doldurma hizmeti ayarlayın. Bunun nedeni, emülatörün varsayılan bir hizmetle gelmemesi olabilir.

Örnek uygulamadan test otomatik doldurma hizmetini yükledikten sonra Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek otomatik doldurma hizmetini etkinleştirin.

Otomatik doldurmayı test etmek üzere bir emülatörü yapılandırma hakkında daha fazla bilgi için Uygulamanızı otomatik doldurma ile test etme bölümüne bakın.

Otomatik doldurma için ipuçları sağla

Otomatik doldurma hizmeti, buluşsal yöntemler kullanarak her görünümün türünü belirler. Ancak uygulamanız bu buluşsal yöntemlere dayanıyorsa siz uygulamanızı güncellerken otomatik doldurma davranışı beklenmedik bir şekilde değişebilir. Otomatik doldurma hizmetinin, uygulamanızın form faktörlerini doğru bir şekilde tanımladığından emin olmak için otomatik doldurma ipuçları sağlayın.

android:autofillHints özelliğini kullanarak otomatik doldurma ipuçlarını ayarlayabilirsiniz. Aşağıdaki örnek, EditText üzerinde "password" ipucu ayarlamaktadır:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autofillHints="password" />

İpuçlarını, aşağıdaki örnekte gösterildiği gibi setAutofillHints() yöntemini kullanarak programatik olarak da ayarlayabilirsiniz:

Kotlin

val password = findViewById<EditText>(R.id.password)
password.setAutofillHints(View.AUTOFILL_HINT_PASSWORD)

Java

EditText password = findViewById(R.id.password);
password.setAutofillHints(View.AUTOFILL_HINT_PASSWORD);

Önceden tanımlanmış ipucu sabitlerini dahil et

Otomatik doldurma çerçevesi, ipuçlarını doğrulamaz. Bu ipuçları, otomatik doldurma hizmetinde değişiklik veya doğrulama yapılmadan iletilir. Herhangi bir değeri kullanabilirsiniz, ancak View ve AndroidX HintConstants sınıflarında, resmi olarak desteklenen ipucu sabitlerinin listesi bulunur.

Bu sabitlerin bir kombinasyonunu kullanarak, yaygın otomatik doldurma senaryoları için düzenler oluşturabilirsiniz:

Hesap kimlik bilgileri

Giriş formuna AUTOFILL_HINT_USERNAME ve AUTOFILL_HINT_PASSWORD gibi hesap kimlik bilgisi ipuçlarını ekleyebilirsiniz.

Yeni bir hesap oluşturmak için veya kullanıcılar kullanıcı adlarını ve şifrelerini değiştirdiğinde AUTOFILL_HINT_NEW_USERNAME ve AUTOFILL_HINT_NEW_PASSWORD özelliklerini kullanabilirsiniz.

Kredi kartı bilgileri

Kredi kartı bilgilerini isterken AUTOFILL_HINT_CREDIT_CARD_NUMBER ve AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE gibi ipuçlarını kullanabilirsiniz.

Kredi kartı son kullanma tarihleri için aşağıdakilerden birini yapın:

Fiziksel adres

Fiziksel adres formu alanları için aşağıdakiler gibi ipuçlarını kullanabilirsiniz:

Kişilerin adları

Kişilerin adlarını isterken aşağıdakiler gibi ipuçları kullanabilirsiniz:

Telefon numaraları

Telefon numaraları için aşağıdakileri kullanabilirsiniz:

Tek kullanımlık şifre (OTP)

Tek görünümde tek kullanımlık şifre için AUTOFILL_HINT_SMS_OTP kullanabilirsiniz.

Her görünümün OTP'nin tek bir basamağına eşlendiği birden çok görünüm için karakter başına ipuçları oluşturmak üzere generateSmsOtpHintForCharacterPosition() yöntemini kullanabilirsiniz.

Otomatik doldurma için alanları önemli olarak işaretleyin

Uygulamanızdaki bağımsız alanları otomatik doldurma amacıyla bir görünüm yapısına ekleyebilirsiniz. Görünümler, varsayılan olarak IMPORTANT_FOR_AUTOFILL_AUTO modunu kullanır. Bu mod, Android'in bir görünümün otomatik doldurma için önemli olup olmadığını belirlemek amacıyla buluşsal yöntemleri kullanmasını sağlar.

Bununla birlikte, bir görünümün, bir görünüm yapısının veya tüm etkinliğin otomatik doldurma için önemli olmadığı durumlar da vardır:

  • Giriş etkinliğinde bir CAPTCHA alanı
  • Kullanıcının içerik oluşturduğu görünüm (ör. metin veya e-tablo düzenleyicisi)
  • Oyunun içindeki bazı etkinliklerdeki (ör. oynanabilirliği gösterenler) görüntüleme sayısı

android:importantForAutofill özelliğini kullanarak bir görünümün otomatik doldurma için önemini ayarlayabilirsiniz:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:importantForAutofill="no" />

importantForAutofill değeri aşağıdakilerden herhangi biri olabilir:

auto
Android sisteminin, görünümün otomatik doldurma için önemli olup olmadığını belirlemek amacıyla bulgularını kullanmasına izin verin.
no
Bu görünüm, otomatik doldurma için önemli değildir.
noExcludeDescendants
Bu görünüm ve alt öğeleri otomatik doldurma için önemli değildir.
yes
Bu görünüm, otomatik doldurma için önemlidir.
yesExcludeDescendants
Bu görünüm otomatik doldurma için önemlidir ancak otomatik doldurma için alt öğeleri önemli değildir.

setImportantForAutofill() yöntemini de kullanabilirsiniz:

Kotlin

val captcha = findViewById<TextView>(R.id.captcha)
captcha.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO)

Java

TextView captcha = findViewById(R.id.captcha);
captcha.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);

Yukarıdaki örnek kullanım alanlarını otomatik doldurma için önemsiz hale getirmek için aşağıdaki adımları uygulayabilirsiniz:

  • Giriş etkinliğindeki bir CAPTCHA alanı: Bu görünümü önemsiz olarak işaretlemek için android:importantForAutofill="no" veya IMPORTANT_FOR_AUTOFILL_NO alanını kullanın.
  • Kullanıcının içerik oluşturduğu görünüm: Görünüm yapısının tamamını önemsiz olarak işaretlemek için android:importantForAutofill="noExcludeDescendants" veya IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS kullanın.
  • Oyunlardaki bazı etkinliklerdeki görüntüleme sayısı: Görünüm yapısının tamamını önemsiz olarak işaretlemek için android:importantForAutofill="noExcludeDescendants" veya IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS kullanın.

Web sitesi ve mobil uygulama verilerini ilişkilendirme

Google ile otomatik doldurma gibi otomatik doldurma hizmetleri, uygulama ve bir web sitesi ilişkilendirildikten sonra tarayıcılar ve Android cihazlar arasında kullanıcı giriş verilerini paylaşabilir. Bir kullanıcı her iki platformda da aynı otomatik doldurma hizmetini seçtiğinde, web uygulamanızda oturum açtığınızda giriş kimlik bilgileri ilgili Android uygulamanızda oturum açtığında otomatik olarak doldurulabilir.

Android uygulamanızı web sitenizle ilişkilendirmek için sitenizde delegate_permission/common.get_login_creds ilişkisiyle bir Dijital Öğe Bağlantısı barındırın. Daha sonra, ilişkilendirmeyi uygulamanızın AndroidManifest.xml dosyasında beyan edin. Web sitenizi Android uygulamanızla ilişkilendirme hakkında ayrıntılı talimatlar için Uygulamalar ve web sitelerinde otomatik oturum açmayı etkinleştirme bölümüne bakın.

Otomatik doldurma iş akışını tamamlama

Bu bölümde, uygulamanızın kullanıcıları için otomatik doldurma işlevini iyileştirmek üzere adımlar atabileceğiniz belirli senaryolar açıklanmaktadır.

Otomatik doldurmanın etkin olup olmadığını belirleme

Kullanıcılar Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek otomatik doldurmayı etkinleştirebilir veya devre dışı bırakabilir ve otomatik doldurma hizmetini değiştirebilir. Uygulamanız kullanıcının otomatik doldurma ayarlarını geçersiz kılamaz. Ancak otomatik doldurma özelliği kullanıcı tarafından kullanılabiliyorsa uygulamanızda veya uygulamanızın belirli görünümlerinde ek otomatik doldurma işlevleri uygulayabilirsiniz.

Örneğin, kullanıcı için otomatik doldurma etkinleştirildiyse TextView, taşma menüsünde bir otomatik doldurma girişi gösterir. Otomatik doldurmanın kullanıcı için etkinleştirilip etkinleştirilmediğini kontrol etmek üzere AutofillManager nesnesinin isEnabled() yöntemini çağırın.

Kayıt ve giriş deneyiminizin otomatik doldurma olmadan kullanıcılar için optimize edildiğinden emin olmak amacıyla One Tap ile oturum açma özelliğini uygulayın.

Otomatik doldurma isteğini zorunlu kıl

Bazen bir kullanıcı işlemine yanıt olarak bir otomatik doldurma isteğini zorla gerçekleştirmeniz gerekir. Örneğin TextView, kullanıcı görünümde dokunup basılı tuttuğunda bir otomatik doldurma menü öğesi sunar. Aşağıdaki kod örneğinde, bir otomatik doldurma isteğinin nasıl zorunlu kılınacağı gösterilmektedir:

Kotlin

fun eventHandler(view: View) {
    val afm = requireContext().getSystemService(AutofillManager::class.java)
    afm?.requestAutofill(view)
}

Java

public void eventHandler(View view) {
    AutofillManager afm = context.getSystemService(AutofillManager.class);
    if (afm != null) {
        afm.requestAutofill(view);
    }
}

Mevcut otomatik doldurma bağlamını iptal etmek için cancel() yöntemini de kullanabilirsiniz. Bu, giriş sayfasındaki alanları temizleyen bir düğmeniz varsa yararlı olabilir.

Seçici kontrollerindeki veriler için doğru otomatik doldurma türünü kullan

Seçiciler, kullanıcıların tarih veya saat verilerinin depolandığı bir alanın değerini değiştirmesine olanak tanıyan bir kullanıcı arayüzü sunarak otomatik doldurma özelliğiyle kullanışlıdır. Örneğin, kredi kartı biçiminde tarih seçici, kullanıcıların kredi kartlarının son kullanma tarihini girmelerine veya değiştirmelerine olanak tanır. Ancak, seçici görünür olmadığında verileri görüntülemek için EditText gibi başka bir görünüm kullanmanız gerekir.

EditText nesnesi yerel olarak AUTOFILL_TYPE_TEXT türünde otomatik doldurma verileri bekler. Farklı türde veriler kullanıyorsanız EditText öğesinden devralan ve karşılık gelen veri türünü işlemek için gerekli yöntemleri uygulayan özel bir görünüm oluşturun. Örneğin, tarih alanınız varsa yöntemleri AUTOFILL_TYPE_DATE türündeki değerleri doğru şekilde işleyen bir mantıkla uygulayın.

Otomatik doldurma veri türünü belirlediğinizde, otomatik doldurma hizmeti görünümde görüntülenen verilerin uygun bir temsilini oluşturabilir. Daha fazla bilgi edinmek için Otomatik doldurma özelliğiyle seçicileri kullanma bölümüne bakın.

Otomatik doldurma bağlamını tamamlayın

Otomatik doldurma çerçevesi, otomatik doldurma bağlamı tamamlandıktan sonra "Otomatik doldurma için kaydedilsin mi?" iletişim kutusu göstererek kullanıcı girişini gelecekte kullanılmak üzere kaydeder. Genellikle bir etkinlik bittiğinde otomatik doldurma bağlamı da sona erer. Bununla birlikte, çerçeveyi açıkça bildirmeniz gereken bazı durumlar vardır. Örneğin, hem giriş hem de içerik ekranlarınız için aynı etkinliği ama farklı parçaları kullanıyorsanız. Bu durumlarda, AutofillManager.commit() yöntemini çağırarak bağlamı açıkça tamamlayabilirsiniz.

Özel görünümler için destek

Özel görünümler, otomatik doldurma API'sini kullanarak otomatik doldurma çerçevesine maruz kalan meta verileri belirtebilir. Bazı görünümler, OpenGL ile oluşturulan kullanıcı arayüzünü içeren görünümler gibi sanal alt öğelerin kapsayıcısı işlevi görür. Bu görünümlerin otomatik doldurma çerçevesiyle çalışmadan önce uygulamada kullanılan bilgilerin yapısını belirtmek için API'yi kullanması gerekir.

Uygulamanızda özel görünümler kullanılıyorsa aşağıdaki senaryoları göz önünde bulundurun:

  • Özel görünüm, standart görünüm yapısı veya varsayılan bir görünüm yapısı sağlar.
  • Özel görünüm, sanal bir yapıya veya otomatik doldurma çerçevesinde kullanılamayan bir görünüm yapısına sahiptir.

Standart görünüm yapısına sahip özel görünümler

Özel görünümler, otomatik doldurmanın çalışması için gereken meta verileri tanımlayabilir. Özel görünümünüzün, meta verileri otomatik doldurma çerçevesiyle çalışacak şekilde uygun şekilde yönettiğinden emin olun. Özel görünümünüzün şu işlemleri yapması gerekir:

  • Çerçevenin uygulamanıza gönderdiği otomatik doldurma değerini işleyin.
  • Çerçeveye otomatik doldurma türünü ve değerini sağlayın.

Otomatik doldurma tetiklendiğinde otomatik doldurma çerçevesi, görünümünüzde autofill() kodunu çağırır ve görünümünüzün kullanması gereken değeri gönderir. Özel görünümünüzün otomatik doldurma değerini nasıl işleyeceğini belirtmek için autofill() uygulayın.

Görünümünüzde, sırasıyla getAutofillType() ve getAutofillValue() yöntemlerini geçersiz kılarak bir otomatik doldurma türü ve değeri belirtilmelidir.

Son olarak, kullanıcı görünüm için mevcut durumunda bir değer sağlayamıyorsa (örneğin, görünüm devre dışıysa) otomatik doldurma, görünümü doldurmamalıdır. Böyle durumlarda getAutofillType() değeri AUTOFILL_TYPE_NONE, getAutofillValue() null değerini döndürmeli ve autofill() hiçbir şey yapmamalıdır.

Aşağıdaki durumlarda, çerçeve içinde düzgün bir şekilde çalışmak için ek adımlar gerekir:

  • Özel görünüm düzenlenebilir.
  • Özel görünüm hassas veriler içerir.

Özel görünüm düzenlenebilir

Görünüm düzenlenebilirse AutofillManager nesnesinde notifyValueChanged() yöntemini çağırarak otomatik doldurma çerçevesini değişiklikler hakkında bilgilendirin.

Özel görünüm hassas veriler içeriyor

Bir görünüm e-posta adresleri, kredi kartı numaraları ve şifreler gibi kimliği tanımlayabilecek bilgiler (PII) içeriyorsa hassas olarak işaretlenmelidir.

Genel olarak, içeriği statik kaynaklardan gelen görünümler hassas veri içermezken, içeriği dinamik olarak ayarlanan görüntülemeler hassas veriler içerebilir. Örneğin, kullanıcı adınızı girin ifadesini içeren bir etiket hassas veriler içermezken Merhaba, Can içeren bir etiket hassas veriler içermez.

Otomatik doldurma çerçevesi, varsayılan olarak tüm verilerin hassas olduğunu varsayar. Hassas olmayan verileri işaretleyebilirsiniz.

Bir görünümün hassas veri içerip içermediğini işaretlemek için ViewStructure nesnesine onProvideAutofillStructure() uygulayın ve setDataIsSensitive() öğesini çağırın.

Aşağıdaki kod örneğinde, görünüm yapısındaki verilerin nasıl hassas değil olarak işaretleneceği gösterilmektedir:

Kotlin

override fun onProvideAutofillStructure(structure: ViewStructure, flags: Int) {
    super.onProvideAutofillStructure(structure, flags)

    structure.setDataIsSensitive(false)
}

Java

@Override
public void onProvideAutofillStructure(ViewStructure structure, int flags) {
    super.onProvideAutofillStructure(structure, flags);

    structure.setDataIsSensitive(false);
}

Bir görünüm yalnızca önceden tanımlanmış değerleri kabul ediyorsa görünümü otomatik olarak doldurmak için kullanılabilecek seçenekleri belirlemek üzere setAutofillOptions() yöntemini kullanabilirsiniz. Özellikle otomatik doldurma türü AUTOFILL_TYPE_LIST olan görünümlerin bu yöntemi kullanması gerekir. Çünkü otomatik doldurma hizmeti, görünümü doldurmak için sunulan seçenekleri bilirse daha iyi iş çıkarabilir.

Spinner gibi bir bağdaştırıcı kullanan görünümler de benzerdir. Örneğin, kredi kartı geçerlilik sonu alanlarında kullanılmak üzere geçerli yıla göre dinamik olarak oluşturulan yılları sağlayan bir döner simge, yıl listesi sağlamak için Adapter arayüzünün getAutofillOptions() yöntemini uygulayabilir.

ArrayAdapter kullanan görünümler de değer listeleri sağlayabilir. ArrayAdapter, statik kaynaklar için otomatik doldurma seçeneklerini otomatik olarak ayarlar. Değerleri dinamik olarak sağlıyorsanız getAutofillOptions() değerini geçersiz kılın.

Sanal yapılı özel görünümler

Otomatik doldurma çerçevesinin, uygulamanızın kullanıcı arayüzündeki bilgileri düzenleyebilmesi ve kaydedebilmesi için bir görünüm yapısı gerekir. Görünüm yapısı, aşağıdaki durumlarda çerçevede kullanılamaz:

  • Uygulama, kullanıcı arayüzünü oluşturmak için OpenGL gibi alt düzey bir oluşturma motoru kullanır.
  • Uygulama, kullanıcı arayüzünü çizmek için bir Canvas örneği kullanır.

Bu durumlarda, onProvideAutofillVirtualStructure() uygulayıp aşağıdaki adımları uygulayarak bir görünüm yapısı belirtebilirsiniz:

  1. addChildCount() yöntemini çağırarak görüntüleme yapısının alt sayısını artırın.
  2. newChild() numaralı telefonu arayarak çocuk ekleyin.
  3. setAutofillId() yöntemini çağırarak alt yayıncının otomatik doldurma kimliğini ayarlayın.
  4. Otomatik doldurma değeri ve türü gibi ilgili özellikleri ayarlayın.
  5. Sanal alt öğedeki veriler hassas ise true öğesini setDataIsSensitive() hesabına, aksi takdirde false değerini iletin.

Aşağıdaki kod snippet'i, sanal yapıda yeni bir alt öğenin nasıl oluşturulacağını göstermektedir:

Kotlin

override fun onProvideAutofillVirtualStructure(structure: ViewStructure, flags: Int) {

    super.onProvideAutofillVirtualStructure(structure, flags)

    // Create a new child in the virtual structure.
    structure.addChildCount(1)
    val child = structure.newChild(childIndex)

    // Set the autofill ID for the child.
    child.setAutofillId(structure.autofillId!!, childVirtualId)

    // Populate the child by providing properties such as value and type.
    child.setAutofillValue(childAutofillValue)
    child.setAutofillType(childAutofillType)

    // Some children can provide a list of values, such as when the child is
    // a spinner.
    val childAutofillOptions = arrayOf<CharSequence>("option1", "option2")
    child.setAutofillOptions(childAutofillOptions)

    // Just like other types of views, mark the data as sensitive when
    // appropriate.
    val sensitive = !contentIsSetFromResources()
    child.setDataIsSensitive(sensitive)
}

Java

@Override
public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) {

    super.onProvideAutofillVirtualStructure(structure, flags);

    // Create a new child in the virtual structure.
    structure.addChildCount(1);
    ViewStructure child =
            structure.newChild(childIndex);

    // Set the autofill ID for the child.
    child.setAutofillId(structure.getAutofillId(), childVirtualId);

    // Populate the child by providing properties such as value and type.
    child.setAutofillValue(childAutofillValue);
    child.setAutofillType(childAutofillType);

    // Some children can provide a list of values, such as when the child is
    // a spinner.
    CharSequence childAutofillOptions[] = { "option1", "option2" };
    child.setAutofillOptions(childAutofillOptions);

    // Just like other types of views, mark the data as sensitive when
    // appropriate.
    boolean sensitive = !contentIsSetFromResources();
    child.setDataIsSensitive(sensitive);
}

Sanal bir yapıdaki öğeler değiştiğinde, aşağıdaki görevleri gerçekleştirerek çerçeveyi bilgilendirin:

  • Alt öğelerin içindeki odak değişirse AutofillManager nesnesinde notifyViewEntered() ve notifyViewExited() öğelerini çağırın.
  • Bir alt öğenin değeri değişirse AutofillManager nesnesinde notifyValueChanged() çağrısı yapın.
  • Kullanıcı, iş akışındaki bir adımı tamamladığı (örneğin, giriş formunu kullanarak oturum açtığı) için görünüm hiyerarşisi artık kullanılamıyorsa AutofillManager nesnesinde commit() çağrısı yapın.
  • Kullanıcı, iş akışındaki bir adımı iptal ettiği (ör. kullanıcı, giriş formunu temizleyen bir düğmeye dokunduğunda) için görünüm hiyerarşisi geçerli değilse AutofillManager nesnesinde cancel() işlevini çağırın.

Otomatik doldurma etkinliklerinde geri çağırmalar kullanın

Uygulamanız kendi otomatik tamamlama görünümlerini sağlıyorsa uygulamaya, kullanıcı arayüzü otomatik doldurmadaki değişikliklere yanıt olarak görünümleri etkinleştirmesini veya devre dışı bırakmasını söyleyen bir mekanizmaya ihtiyacınız vardır. Otomatik doldurma çerçevesi, bu mekanizmayı AutofillCallback biçiminde sağlar.

Bu sınıfta, bir görünümle ilişkili otomatik doldurma durumunda değişiklik olduğunda uygulamanın çağırdığı onAutofillEvent(View, int) yöntemi sağlanmaktadır. Bu yöntemin, uygulamanızın sanal görünümlerde kullanabileceği childId parametresini içeren aşırı yüklenmiş bir sürümü de vardır. Kullanılabilir durumlar, geri çağırmada sabit değerler olarak tanımlanır.

AutofillManager sınıfının registerCallback() yöntemini kullanarak bir geri çağırma kaydedebilirsiniz. Aşağıdaki kod örneğinde, otomatik doldurma etkinlikleri için bir geri çağırmanın nasıl bildirileceği gösterilmektedir:

Kotlin

val afm = context.getSystemService(AutofillManager::class.java)

afm?.registerCallback(object : AutofillManager.AutofillCallback() {
    // For virtual structures, override
    // onAutofillEvent(View view, int childId, int event) instead.
    override fun onAutofillEvent(view: View, event: Int) {
        super.onAutofillEvent(view, event)
        when (event) {
            EVENT_INPUT_HIDDEN -> {
                // The autofill affordance associated with the view was hidden.
            }
            EVENT_INPUT_SHOWN -> {
                // The autofill affordance associated with the view was shown.
            }
            EVENT_INPUT_UNAVAILABLE -> {
                // Autofill isn't available.
            }
        }

    }
})

Java

AutofillManager afm = getContext().getSystemService(AutofillManager.class);

afm.registerCallback(new AutofillManager.AutofillCallback() {
    // For virtual structures, override
    // onAutofillEvent(View view, int childId, int event) instead.
    @Override
    public void onAutofillEvent(@NonNull View view, int event) {
        super.onAutofillEvent(view, event);
        switch (event) {
            case EVENT_INPUT_HIDDEN:
                // The autofill affordance associated with the view was hidden.
                break;
            case EVENT_INPUT_SHOWN:
                // The autofill affordance associated with the view was shown.
                break;
            case EVENT_INPUT_UNAVAILABLE:
                // Autofill isn't available.
                break;
        }
    }
});

Geri çağırmayı kaldırma zamanı geldiğinde unregisterCallback() yöntemini kullanın.

Otomatik doldurma vurgulanmış çekilebilirliğini özelleştirin

Bir görünüm otomatik olarak doldurulduğunda platform, görünüm içeriğinin otomatik olarak doldurulduğunu belirtmek için görünüm üzerinde bir Drawable oluşturur. Varsayılan olarak bu çekilebilir öğe, arka plan çizmek için kullanılan temanın renginden biraz daha koyu olan yarı saydam bir renkte düz bir dikdörtgendir. Çekilebilir öğenin değiştirilmesi gerekmez ancak bu örnekte gösterildiği gibi, uygulama veya etkinlik tarafından kullanılan temanın android:autofilledHighlight öğesinin geçersiz kılınmasıyla özelleştirilebilir:

res/values/styles.xml

<resources>
    <style name="MyAutofilledHighlight" parent="...">
        <item name="android:autofilledHighlight">@drawable/my_drawable</item>
    </style>
</resources>

res/drawable/my_drawable.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#4DFF0000" />
</shape>

AndroidManifest.xml

<application ...
    android:theme="@style/MyAutofilledHighlight">
<!-- or -->
<activity ...
    android:theme="@style/MyAutofilledHighlight">

Otomatik doldurma için kimlik doğrulaması

Otomatik doldurma hizmeti, uygulamanın uygulamanızdaki alanları doldurabilmesi için kullanıcının kimlik doğrulamasını zorunlu kılabilir. Bu durumda Android sistemi, etkinlik yığınının bir parçası olarak hizmetin kimlik doğrulama etkinliğini başlatır.

Kimlik doğrulama hizmet içinde gerçekleştiğinden kimlik doğrulamayı desteklemek için uygulamanızı güncellemeniz gerekmez. Ancak etkinlik yeniden başlatıldığında (ör. görünüm yapısını onStart() veya onResume()'da değil, onCreate() içinde oluşturarak) etkinliğin görünüm yapısının korunduğundan emin olmanız gerekir.

Bir otomatik doldurma hizmeti kimlik doğrulaması gerektiğinde uygulamanızın nasıl davrandığını doğrulamak için AutofillFramework örneğindeki HeuristicsService hizmetini kullanabilir ve bunu, dolgu yanıtı kimlik doğrulaması gerektirecek şekilde yapılandırabilirsiniz. Bu sorunu emüle etmek için BadViewStructureCreationSignInActivity örneğini de kullanabilirsiniz.

Geri dönüştürülmüş görünümlere otomatik doldurma kimlikleri atama

RecyclerView sınıfı gibi görünümleri geri dönüştüren container'lar, büyük veri kümelerine dayanan öğe kaydırma listelerini görüntülemesi gereken uygulamalar için yararlıdır. Kapsayıcı kaydırdıkça, sistem düzendeki görünümleri yeniden kullanır, ancak görünümler yeni içerik içerir.

Geri dönüştürülmüş bir görünümün ilk içeriği doldurulursa otomatik doldurma hizmeti, otomatik doldurma kimliklerini kullanarak görünümlerin mantıksal anlamını korur. Sistem, düzendeki görünümleri yeniden kullandığında görünümlerin mantıksal kimliklerinin aynı kalması ve yanlış otomatik doldurma kullanıcı verilerinin bir otomatik doldurma kimliğiyle ilişkilendirilmesine neden olduğunda sorun oluşur.

Android 9 (API düzeyi 28) ve sonraki sürümleri çalıştıran cihazlarda bu sorunu çözmek için RecyclerView tarafından kullanılan görünümlerin otomatik doldurma kimliğini aşağıdaki yöntemleri kullanarak açık bir şekilde yönetin:

  • getNextAutofillId() yöntemi, etkinliğe özel yeni bir otomatik doldurma kimliği alır.
  • setAutofillId() yöntemi, etkinlikte bu görünümün benzersiz ve mantıksal otomatik doldurma kimliğini ayarlar.

Bilinen sorunları giderme

Bu bölümde, otomatik doldurma çerçevesindeki bilinen sorunlara yönelik çözümler sunulmaktadır.

Otomatik doldurma, Android 8.0, 8.1'de uygulamaların kilitlenmesine neden oluyor

Android 8.0 (API düzeyi 26) ve 8.1 (API düzeyi 27) sürümlerinde otomatik doldurma, belirli senaryolarda uygulamanızın kilitlenmesine neden olabilir. Olası sorunları çözmek için importantForAutofill=no ile otomatik olarak doldurulmamış görünümleri etiketleyin. Ayrıca tüm etkinliği importantForAutofill=noExcludeDescendants ile etiketleyebilirsiniz.

Yeniden boyutlandırılan iletişim kutuları otomatik doldurma için dikkate alınmaz

Android 8.1 (API düzeyi 27) ve önceki sürümlerde iletişim kutusundaki bir görünüm görüntülendikten sonra yeniden boyutlandırılırsa görünüm otomatik doldurma için dikkate alınmaz. Bu görünümler, Android sisteminin otomatik doldurma hizmetine gönderdiği AssistStructure nesnesine dahil edilmez. Bu nedenle, görüntülemeler hizmet tarafından doldurulamaz.

Bu sorunu çözmek için iletişim penceresi parametrelerinin token özelliğini, iletişim kutusunu oluşturan etkinliğin token özelliğiyle değiştirin. Otomatik doldurmanın etkin olduğunu doğruladıktan sonra pencere parametrelerini Dialog öğesinden devralan sınıfın onWindowAttributesChanged() yöntemine kaydedin. Ardından, kaydedilen parametrelerin token özelliğini, onAttachedToWindow() yöntemindeki üst etkinliğin token özelliğiyle değiştirin.

Aşağıdaki kod snippet'i, bu geçici çözümü uygulayan bir sınıfı göstermektedir:

Kotlin

class MyDialog(context: Context) : Dialog(context) {

    // Used to store the dialog window parameters.
    private var token: IBinder? = null

    private val isDialogResizedWorkaroundRequired: Boolean
        get() {
            if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O || Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1) {
                return false
            }
            val autofillManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                context.getSystemService(AutofillManager::class.java)
            } else {
                null
            }
            return autofillManager?.isEnabled ?: false
        }

    override fun onWindowAttributesChanged(params: WindowManager.LayoutParams) {
        if (params.token == null && token != null) {
            params.token = token
        }

        super.onWindowAttributesChanged(params)
    }

    override fun onAttachedToWindow() {
        if (isDialogResizedWorkaroundRequired) {
            token = ownerActivity!!.window.attributes.token
        }

        super.onAttachedToWindow()
    }

}

Java

public class MyDialog extends Dialog {

    public MyDialog(Context context) {
        super(context);
    }

    // Used to store the dialog window parameters.
    private IBinder token;

    @Override
    public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
        if (params.token == null && token != null) {
            params.token = token;
        }

        super.onWindowAttributesChanged(params);
    }

    @Override
    public void onAttachedToWindow() {
        if (isDialogResizedWorkaroundRequired()) {
            token = getOwnerActivity().getWindow().getAttributes().token;
        }

        super.onAttachedToWindow();
    }

    private boolean isDialogResizedWorkaroundRequired() {
        if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O
                || Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1) {
            return false;
        }
        AutofillManager autofillManager =
                null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            autofillManager = getContext().getSystemService(AutofillManager.class);
        }
        return autofillManager != null && autofillManager.isEnabled();
    }

}

Gereksiz işlemleri önlemek amacıyla aşağıdaki kod snippet'i, otomatik doldurma özelliğinin cihazda desteklenip desteklenmediğini ve mevcut kullanıcı için etkinleştirilip etkinleştirilmediğini nasıl kontrol edeceğinizi ve bu çözümün gerekli olup olmadığını nasıl kontrol edeceğinizi gösterir:

Kotlin

// AutofillExtensions.kt

fun Context.isDialogResizedWorkaroundRequired(): Boolean {
    // After the issue is resolved on Android, check whether the
    // workaround is still required for the current device.
    return isAutofillAvailable()
}

fun Context.isAutofillAvailable(): Boolean {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
        // The autofill framework is available on Android 8.0
        // or higher.
        return false
    }

    val afm = getSystemService(AutofillManager::class.java)
    // Return true if autofill is supported by the device and enabled
    // for the current user.
    return afm != null && afm.isEnabled
}

Java

public class AutofillHelper {

    public static boolean isDialogResizedWorkaroundRequired(Context context) {
        // After the issue is resolved on Android, check whether the
        // workaround is still required for the current device.
        return isAutofillAvailable(context);
    }

    public static boolean isAutofillAvailable(Context context) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            // The autofill framework is available on Android 8.0
            // or higher.
            return false;
        }

        AutofillManager afm = context.getSystemService(AutofillManager.class);
        // Return true if autofill is supported by the device and enabled
        // for the current user.
        return afm != null && afm.isEnabled();
    }
}

Otomatik doldurma özelliğiyle uygulamanızı test etme

Uygulamanızı otomatik doldurma hizmetleriyle çalışacak şekilde optimize ettikten sonra, otomatik doldurma hizmetleriyle beklendiği gibi çalışıp çalışmadığını test edin.

Uygulamanızı test etmek için Android 8.0 (API düzeyi 26) veya sonraki sürümleri çalıştıran bir emülatör ya da fiziksel cihaz kullanın. Emülatör oluşturma hakkında daha fazla bilgi için Sanal cihaz oluşturma ve yönetme bölümüne bakın.

Otomatik doldurma hizmeti yükleme

Uygulamanızı otomatik doldurma özelliğiyle test etmeden önce otomatik doldurma hizmetleri sağlayan başka bir uygulama yüklemeniz gerekir. Bu amaçla üçüncü taraf uygulamaları kullanabilirsiniz ancak örnek bir otomatik doldurma hizmeti kullanmak daha kolaydır ve böylece üçüncü taraf hizmetlere kaydolmanıza gerek kalmaz.

Uygulamanızı otomatik doldurma hizmetleriyle test etmek için Java'daki Android otomatik doldurma çerçeve örneğini kullanabilirsiniz. Örnek uygulama, uygulamanızla kullanmadan önce iş akışını test etmek için kullanabileceğiniz bir otomatik doldurma hizmeti ve istemci Activity sınıfları sağlar. Bu sayfada android-AutofillFramework örnek uygulaması referans alınmaktadır.

Uygulamayı yükledikten sonra emülatörün sistem ayarlarında Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek otomatik doldurma hizmetini etkinleştirin.

Veri gereksinimlerini analiz edin

Uygulamanızı otomatik doldurma hizmetiyle test etmek için hizmetin, uygulamanızı doldurmak üzere kullanabileceği verilere sahip olması gerekir. Hizmetin, uygulamanızın görünümlerinde ne tür verilerin beklendiğini de anlaması gerekir. Örneğin, uygulamanızın kullanıcı adı bekleyen bir görünümü varsa hizmetin, kullanıcı adı içeren bir veri kümesi ve görünümün bu tür verileri beklediğini anlaması için bir mekanizmaya sahip olması gerekir.

android:autofillHints özelliğini ayarlayarak hizmete görünümlerinizde ne tür veriler beklendiğini bildirin. Bazı hizmetler, veri türünü belirlemek için gelişmiş buluşsal yöntemler kullanır ancak örnek uygulama gibi diğerleri, bu bilgileri sağlamak için geliştiriciye güvenir. Otomatik doldurma için alakalı görünümlerde android:autofillHints özelliğini ayarlarsanız uygulamanız otomatik doldurma hizmetleriyle daha iyi çalışır.

Testinizi çalıştırın

Veri gereksinimlerini analiz ettikten sonra testinizi çalıştırabilirsiniz. Test verilerini otomatik doldurma hizmetine kaydedebilir ve uygulamanızda otomatik doldurmayı tetikleyebilirsiniz.

Hizmete veri kaydet

Verileri şu anda etkin olan otomatik doldurma hizmetine kaydetmek için aşağıdakileri yapın:

  1. Test sırasında kullanmak istediğiniz veri türünü bekleyen bir görünüm içeren bir uygulama açın. android-AutofillFramework örnek uygulaması, kullanıcı arayüzüne kredi kartı numaraları ve kullanıcı adları gibi çeşitli veri türlerini bekleyen görünümler sunar.
  2. İhtiyacınız olan veri türünü barındıran görünüme dokunun.
  3. Görünüme bir değer girin.
  4. Onay düğmesine (ör. Oturum aç veya Gönder) dokunun. Genellikle hizmetin verileri kaydetmeden önce formu göndermeniz gerekir.
  5. Sistem iletişim kutusundan izin isteğini doğrulayın. Sistem iletişim kutusu, etkin durumdaki hizmetin adını gösterir ve testinizde kullanmak istediğiniz hizmetin bu hizmet olup olmadığını sorar. Hizmeti kullanmak istiyorsanız Kaydet'e dokunun.

Android izin iletişim kutusunu göstermiyorsa veya hizmet, testinizde kullanmak istediğiniz hizmet değilse sistem ayarlarında hizmetin şu anda etkin olup olmadığını kontrol edin.

Uygulamanızda otomatik doldurmayı tetikleyin

Uygulamanızda otomatik doldurmayı tetiklemek için aşağıdakileri yapın:

  1. Uygulamanızı açın ve test etmek istediğiniz görünümleri içeren etkinliğe gidin.
  2. Doldurulması gereken görünüme dokunun.
  3. Sistem, Şekil 1'de gösterildiği gibi, görünümü doldurabilecek veri kümelerini içeren otomatik doldurma kullanıcı arayüzünü görüntüler.
  4. Kullanmak istediğiniz verileri içeren veri kümesine dokunun. Görünüm, hizmette daha önce depolanan verileri gösterir.
Otomatik doldurma kullanıcı arayüzü, "dataset-2"yi kullanılabilir bir veri kümesi olarak gösteriyor
Şekil 1. Mevcut veri kümelerini gösteren otomatik doldurma kullanıcı arayüzü.

Android, otomatik doldurma kullanıcı arayüzünü görüntülemiyorsa aşağıdaki sorun giderme seçeneklerini deneyebilirsiniz:

  • Uygulamanızdaki görünümlerin android:autofillHints özelliğinde doğru değeri kullandığından emin olun. Özelliğin olası değerlerinin listesi için View sınıfındaki AUTOFILL_HINT ön ekine sahip sabit değerlere bakın.
  • android:importantForAutofill özelliğinin, doldurulması gereken görünümde no dışında bir değere veya görünümde ya da üst öğelerinden birinde noExcludeDescendants dışında bir değere ayarlandığından emin olun.