Standart görünümler kullanan uygulamalar, özel yapılandırma gerektirmeden otomatik doldurma çerçevesiyle çalışır. Ayrıca, uygulamanızın çerçeveyle çalışma şeklini de optimize edebilirsiniz.
Otomatik doldurma ortamını ayarlama
Bu bölümde, uygulamanız için temel otomatik doldurma işlevinin nasıl ayarlanacağı açıklanmaktadır.
Otomatik doldurma hizmeti yapılandırma
Uygulamanızın otomatik doldurma çerçevesini kullanabilmesi 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 tablette otomatik doldurma hizmeti olsa da uygulamanızı test ederken Android otomatik doldurma çerçevesi örneğindeki otomatik doldurma hizmeti gibi bir test hizmeti kullanmanızı öneririz. Emülatör varsayılan bir hizmetle gelmediği için emülatör kullanırken otomatik doldurma hizmetini açıkça ayarlayın.
Örnek uygulamadan otomatik doldurma testi hizmetini yükledikten sonra Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti bölümüne giderek otomatik doldurma hizmetini etkinleştirin.
Otomatik doldurmayı test etmek için bir emülatör yapılandırma hakkında daha fazla bilgi edinmek isterseniz Uygulamanızı otomatik doldurma ile test etme başlıklı makaleyi inceleyin.
Otomatik doldurma için ipuçları sağlama
Otomatik doldurma hizmeti, her bir görünümün türünü sezgisel yöntemler kullanarak belirler. Ancak uygulamanız bu sezgisel kurallara dayanıyorsa uygulamanızı güncellerken otomatik doldurma davranışı beklenmedik şekilde değişebilir. Otomatik doldurma hizmetinin uygulamanızın form faktörlerini doğru şekilde tanımladığından emin olmak için otomatik doldurma ipuçları sağlayın.
android:autofillHints
özelliğini kullanarak otomatik doldurma ipuçları ayarlayabilirsiniz. Aşağıdaki örnekte, EditText
öğesinde bir "password"
ipucu ayarlanmıştır:
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:autofillHints="password" />
İpuçları, aşağıdaki örnekte gösterildiği gibi setAutofillHints()
yöntemini kullanarak da programatik olarak ayarlanabilir:
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 etme
Otomatik doldurma çerçevesi ipuçlarını doğrulamaz. İpuçları, herhangi bir değişiklik veya doğrulama yapılmadan otomatik doldurma hizmetine iletilir. İstediğiniz değeri kullanabilirsiniz. Ancak View
ve AndroidX HintConstants
sınıfları, resmi olarak desteklenen ipucu sabitlerinin listelerini içerir.
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ı ekleyebilirsiniz.
Yeni 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
öğelerini kullanabilirsiniz.
Kredi kartı bilgileri
Kredi kartı bilgilerini isterken AUTOFILL_HINT_CREDIT_CARD_NUMBER
ve AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE
gibi ipuçları kullanabilirsiniz.
Kredi kartı son kullanma tarihleri için aşağıdakilerden birini yapın:
- Geçerlilik bitiş tarihi için tek bir görünüm kullanıyorsanız
AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE
simgesini kullanın. - Geçerlilik bitiş tarihinin her bölümü için farklı bir görünüm kullanıyorsanız ilgili görünümler için
AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY
,AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH
veAUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR
değerlerini kullanabilirsiniz.
Fiziksel adres
Fiziksel adres form alanları için aşağıdakiler gibi ipuçlarını kullanabilirsiniz:
- Tek görünümdeki bir adres için
AUTOFILL_HINT_POSTAL_ADDRESS
değerini kullanın. - Bir adresin farklı bölümleri için ayrı görünümler kullanırken aşağıdakileri kullanabilirsiniz:
Kişi adları
Kullanıcıların adlarını isterken aşağıdaki gibi ipuçları kullanabilirsiniz:
- Bir kişinin tam adını tek bir görünümde otomatik olarak doldurmak için
AUTOFILL_HINT_PERSON_NAME
simgesini kullanın. - Bir adın farklı bölümleri için ayrı görünümler kullanıyorsanız aşağıdakilerden birini kullanabilirsiniz:
Telefon numaraları
Telefon numaraları için şunları kullanabilirsiniz:
- Tek bir görünümde tam telefon numarası istediğinizde
AUTOFILL_HINT_PHONE_NUMBER
değerini kullanın. - Telefon numarasının farklı bölümleri için ayrı görünümler kullanıyorsanız aşağıdakilerden birini kullanabilirsiniz:
Tek kullanımlık şifre (OTP)
Tek seferlik şifreyi tek bir görünümde görmek için AUTOFILL_HINT_SMS_OTP
simgesini kullanabilirsiniz.
Her görünümün OTP'nin tek bir hanesine eşlendiği birden fazla görünüm için karakter başına ipucu oluşturmak üzere generateSmsOtpHintForCharacterPosition()
yöntemini kullanabilirsiniz.
Alanları otomatik doldurma için önemli olarak işaretleme
Uygulamanızdaki alanları, otomatik doldurma amacıyla bir görünüm yapısına dahil edebilirsiniz. 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 üzere kendi sezgisel yaklaşımlarını kullanmasına olanak tanır.
Ancak bir görünümün, görünüm yapısının veya etkinliğin tamamının otomatik doldurma için önemli olmadığı durumlar vardır:
- Giriş etkinliğindeki
CAPTCHA
alanı - Kullanıcının içerik oluşturduğu bir görünüm (ör. metin veya e-tablo düzenleyici)
- Oyunlardaki bazı etkinliklerdeki görüntülemeler (ör. oyun oynama işlemlerini gösterenler)
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 Sistemi'nin, görünümün otomatik doldurma için önemli olup olmadığını belirlemek için buluşsal yöntemlerini 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 alt öğeleri otomatik doldurma için ö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 olarak aşağıdaki gibi belirtebilirsiniz:
- Giriş etkinliğindeki
CAPTCHA
alanı: Bu görünümü önemsiz olarak işaretlemek içinandroid:importantForAutofill="no"
veyaIMPORTANT_FOR_AUTOFILL_NO
değerini kullanın. - Kullanıcıların içerik oluşturduğu bir görünüm: Görüntüleme yapısının tamamını
android:importantForAutofill="noExcludeDescendants"
veyaIMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS
ile işaretleyerek önemsiz olarak işaretleyin. - Oyunlardaki bazı etkinliklerde yer alan görünümler: Görünüm yapısının tamamını önemsiz olarak işaretlemek için
android:importantForAutofill="noExcludeDescendants"
veyaIMPORTANT_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 web sitesi ilişkilendirildikten sonra kullanıcı giriş verilerini tarayıcılar ve Android cihazlar arasında paylaşabilir. Kullanıcı her iki platformda da aynı otomatik doldurma hizmetini seçtiğinde, web uygulamanızda oturum açmak, ilgili Android uygulamanızda oturum açtığında giriş kimlik bilgilerinin otomatik olarak doldurulmasını sağlar.
Android uygulamanızı web sitenizle ilişkilendirmek için sitenizde delegate_permission/common.get_login_creds
ilişkisi olan bir Digital Asset Link barındırın. Ardından,
uygulamanızın AndroidManifest.xml
dosyasında ilişkilendirmeyi tanımlayın. Web sitenizi Android uygulamanızla ilişkilendirmeyle ilgili 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ım 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 bölümü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 kullanıcının otomatik doldurma özelliğine erişimi varsa uygulamanızda veya uygulamanızın belirli görünümlerinde ek otomatik doldurma işlevi uygulayabilirsiniz.
Örneğin, kullanıcı için otomatik doldurma etkinse TextView
, taşma menüsünde bir otomatik doldurma girişi gösterir. Kullanıcı için otomatik doldurmanın etkin olup olmadığını kontrol etmek üzere AutofillManager
nesnesinin isEnabled()
yöntemini çağırın.
Kaydolma ve oturum açma deneyiminizin, otomatik doldurma özelliği olmayan kullanıcılar için optimize edildiğinden emin olmak istiyorsanız One Tap ile kaydolma özelliğini uygulayın.
Otomatik doldurma isteğini zorlama
Bazen kullanıcı işlemine yanıt olarak bir otomatik doldurma isteği göndermeniz gerekir. Örneğin, kullanıcı görünüme dokunup basılı tuttuktan sonra TextView
otomatik doldurma menü öğesi sunar.
Aşağıdaki kod örneğinde, otomatik doldurma isteğinin nasıl zorlanacağı 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 olduğunda yararlı olabilir.
Seçici denetimlerindeki veriler için doğru otomatik doldurma türünü kullanın
Seçiciler, kullanıcıların tarih veya saat verilerini depolayan bir alanın değerini değiştirmesine olanak tanıyan bir kullanıcı arayüzü sağlayarak otomatik doldurma özelliğinde yararlı olabilir. Örneğin, bir kredi kartı formunda tarih seçici, kullanıcıların kredi kartlarının son kullanma tarihini girmesine veya değiştirmesine olanak tanır. Ancak, seçici görünmediğinde verileri görüntülemek için EditText
gibi başka bir görünüm kullanmanız gerekir.
EditText
nesnesi, doğal olarak AUTOFILL_TYPE_TEXT
türündeki otomatik doldurma verilerini bekler.
Farklı bir veri türü kullanıyorsanız EditText
'ten devralan ve ilgili veri türünü işlemek için gereken yöntemleri uygulayan özel bir görünüm oluşturun. Örneğin, bir tarih alanınız varsa yöntemleri AUTOFILL_TYPE_DATE
türündeki değerleri doğru şekilde işleyen mantıkla uygulayın.
Otomatik doldurma veri türünü belirttiğinizde otomatik doldurma hizmeti, görünümde gösterilen verilerin uygun bir temsilini oluşturabilir. Daha fazla bilgi için Otomatik doldurma özelliğiyle seçicileri kullanma başlıklı makaleyi inceleyin.
Otomatik doldurma bağlamını tamamlama
Otomatik doldurma bağlamı sona erdikten sonra otomatik doldurma çerçevesi, "Otomatik doldurma için kaydetme" iletişim kutusunu göstererek kullanıcı girişini gelecekte kullanılmak üzere kaydeder. Otomatik doldurma bağlamı genellikle bir etkinlik sona erdiğinde 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 ancak farklı parçaları kullanıyorsanız. Bu gibi durumlarda, AutofillManager.commit()
işlevini çağırarak bağlamı açıkça sonlandırabilirsiniz.
Özel görünümler için destek
Özel görünümler, otomatik doldurma API'sini kullanarak otomatik doldurma çerçevesine sunulan meta verileri belirtebilir. Bazı görünümler, OpenGL tarafından oluşturulan kullanıcı arayüzü içeren görünümler gibi sanal çocukların kapsayıcısı olarak işlev görür. Bu görünümler, otomatik doldurma çerçevesiyle çalışabilmek için uygulamada kullanılan bilgilerin yapısını belirtmek üzere API'yi kullanmalıdır.
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 bir görünüm yapısı veya varsayılan bir görünüm yapısı sağlar.
- Özel görünümün sanal bir yapısı veya otomatik doldurma çerçevesinin kullanamadığı bir görünüm yapısı vardır.
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 aşağıdaki işlemleri gerçekleştirmelidir:
- Ç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()
işlevini ç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ı mevcut durumundaki görünüm için bir değer sağlayamazsa (ör. görünüm devre dışıysa) otomatik doldurma özelliği görünümü doldurmamalıdır.
Bu durumlarda getAutofillType()
, AUTOFILL_TYPE_NONE
döndürmeli, getAutofillValue()
null
döndürmeli ve autofill()
hiçbir şey yapmamalıdır.
Aşağıdaki durumlarda, çerçeve içinde düzgün çalışmak için ek adımlar gerekir:
- Özel görünüm düzenlenebilir.
- Özel görünüm hassas veriler içeriyor.
Özel görünüm düzenlenebilir
Görüntü düzenlenebiliyorsa AutofillManager
nesnesinde notifyValueChanged()
çağrısı yaparak 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 bu görünümler 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ünümler hassas veri içerebilir. Örneğin, Kullanıcı adınızı girin ifadesini içeren bir etiket hassas veri içermezken Merhaba Can ifadesini içeren bir etiket hassas veri içerir.
Otomatik doldurma çerçevesi, tüm verilerin varsayılan olarak 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 onProvideAutofillStructure()
sınıfını uygulayın ve ViewStructure
nesnesinde setDataIsSensitive()
işlevini çağırın.
Aşağıdaki kod örneğinde, görünüm yapısındaki verilerin hassas olmayan olarak nasıl 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 ayarlamak üzere setAutofillOptions()
yöntemini kullanabilirsiniz. Özellikle, otomatik doldurma türü AUTOFILL_TYPE_LIST
olan görünümler bu yöntemi kullanmalıdır. Otomatik doldurma hizmeti, görünümü doldurmak için kullanılabilecek seçenekleri bilirse daha iyi bir iş çıkarabilir.
Spinner
gibi bir adaptör kullanan görünümler de benzer bir durumdur. Örneğin, kredi kartı geçerlilik süresi alanlarında kullanılmak üzere mevcut yıla göre dinamik olarak oluşturulmuş 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ğlarsanız getAutofillOptions()
değerini geçersiz kılın.
Sanal yapıya sahip özel görünümler
Otomatik doldurma çerçevesinin, uygulamanızın kullanıcı arayüzündeki bilgileri düzenleyip kaydedebilmesi için bir görünüm yapısı gerekir. Görünüm yapısı aşağıdaki durumlarda çerçeve tarafından kullanılamaz:
- Uygulama, kullanıcı arayüzünü oluşturmak için OpenGL gibi düşük düzey bir oluşturma motoru kullanır.
- Uygulama, kullanıcı arayüzünü çizmek için
Canvas
örneğini kullanır.
Bu durumlarda, onProvideAutofillVirtualStructure()
kodunu uygulayıp aşağıdaki adımları uygulayarak bir görünüm yapısı belirtebilirsiniz:
addChildCount()
yöntemini çağırarak görüntüleme yapısının alt sayısını artırın.newChild()
numaralı telefonu arayarak çocuk ekleyin.setAutofillId()
çağrısını yaparak çocuğun otomatik doldurma kimliğini ayarlayın.- Otomatik doldurma değeri ve türü gibi alakalı özellikleri ayarlayın.
- Sanal alt öğedeki veriler hassassa
true
öğesinisetDataIsSensitive()
öğesine, aksi takdirdefalse
öğesini iletin.
Aşağıdaki kod snippet'inde, sanal yapıda yeni bir alt öğenin nasıl oluşturulacağı gösterilmektedir:
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); }
Bir sanal yapıdaki öğeler değiştiğinde aşağıdaki görevleri gerçekleştirerek çerçeveyi bilgilendirin:
- children içindeki odak değişirse
AutofillManager
nesnesindenotifyViewEntered()
venotifyViewExited()
işlevini çağırın. - Bir alt öğenin değeri değişirse
AutofillManager
nesnesindenotifyValueChanged()
işlevini çağırın. - Kullanıcı iş akışında bir adımı tamamladığı için (ör. giriş formu kullanarak oturum açtığında) görüntüleme hiyerarşisi artık kullanılamıyorsa
AutofillManager
nesnesindecommit()
işlevini çağırın. - Kullanıcı iş akışında bir adımı iptal ettiği için (ör. kullanıcı bir giriş formunu temizleyen düğmeye dokunduğunda) görünüm hiyerarşisi geçerli değilse
AutofillManager
nesnesindecancel()
işlevini çağırın.
Otomatik doldurma etkinliklerinde geri çağırma işlevlerini kullanma
Uygulamanız kendi otomatik tamamlama görünümlerini sunuyorsa, kullanıcı arayüzü otomatik doldurma özelliğindeki değişikliklere göre uygulamaya 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ıf, bir görünümle ilişkili otomatik doldurma durumunda değişiklik yapıldıktan sonra uygulamanın çağırdığı onAutofillEvent(View, int)
yöntemini sağlar.
Bu yöntemin, uygulamanızın sanal görüntülerle kullanabileceği bir childId
parametresi içeren aşırı yüklenmiş bir sürümü de vardır. Kullanılabilir durumlar, geri çağırma işlevinde sabitler olarak tanımlanır.
AutofillManager
sınıfının registerCallback()
yöntemini kullanarak geri arama 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 aramayı kaldırma zamanı geldiğinde unregisterCallback()
yöntemini kullanın.
Vurgulanan çekilebilir otomatik doldurmayı ö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ün üzerine bir Drawable
simgesi yerleştirir. Varsayılan olarak bu çizilebilir öğe, arka planları çizmek için kullanılan tema renginden biraz daha koyu olan yarı saydam bir renge sahip katı 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
öğesi geçersiz kılınarak özelleştirilebilir:
<resources>
<style name="MyAutofilledHighlight" parent="...">
<item name="android:autofilledHighlight">@drawable/my_drawable</item>
</style>
</resources>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#4DFF0000" />
</shape>
<application ...
android:theme="@style/MyAutofilledHighlight">
<!-- or -->
<activity ...
android:theme="@style/MyAutofilledHighlight">
Otomatik doldurma için kimlik doğrulaması yapma
Otomatik doldurma hizmeti, hizmetin uygulamanızdaki alanları tamamlayabilmesi için önce kullanıcının kimlik doğrulaması yapmasını gerektirebilir. Bu durumda Android sistemi, etkinliğin 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ği için uygulamanızı kimlik doğrulamayı destekleyecek şekilde güncellemeniz gerekmez. Ancak etkinlik yeniden başlatılırken etkinliğin görüntüleme yapısının korunduğundan emin olmanız gerekir. Örneğin, görüntüleme yapısını onStart()
veya onResume()
yerine onCreate()
içinde oluşturabilirsiniz.
Otomatik Doldurma Çerçevesi örneğindeki HeuristicsService'i kullanarak ve doldurma yanıtı kimlik doğrulamasını gerektirecek şekilde yapılandırarak, bir otomatik doldurma hizmeti kimlik doğrulama gerektirdiğinde uygulamanızın nasıl davrandığını doğrulayabilirsiniz. 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 atayın
Görünümleri geri dönüştüren kapsayıcılar (ör. RecyclerView
sınıfı), büyük veri kümelerine dayalı öğelerin kayan listelerini görüntülemesi gereken uygulamalar için kullanışlıdır. Kapsayıcı kaydırıldığında sistem, düzendeki görünümleri yeniden kullanır ancak görünümler yeni içerikler içerir.
Geri dönüştürülmüş bir görünümün ilk içerikleri doldurulmuşsa otomatik doldurma hizmeti, otomatik doldurma kimliklerini kullanarak görünümlerin mantıksal anlamını korur. Sistem, görünümleri düzende yeniden kullandığında görünümlerin mantıksal kimlikleri aynı kalır ve yanlış otomatik doldurma kullanıcı verilerinin bir otomatik doldurma kimliğiyle ilişkilendirilmesine neden olur.
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öntemlerden birini kullanarak açıkça yönetin:
getNextAutofillId()
yöntemi, etkinliğe özgü yeni bir otomatik doldurma kimliği alır.setAutofillId()
yöntemi, etkinlikte bu görünümün benzersiz, mantıksal otomatik doldurma kimliğini ayarlar.
Bilinen sorunları giderin
Bu bölümde, otomatik doldurma çerçevesindeki bilinen sorunlara yönelik geçici çözümler sunulmaktadır.
Otomatik doldurma, Android 8.0 ve 8.1'de uygulamaların kilitlenmesine neden oluyor
Android 8.0 (API düzeyi 26) ve 8.1'de (API düzeyi 27) otomatik doldurma, uygulamanızın belirli senaryolarda kilitlenmesine neden olabilir. Olası sorunları gidermek için otomatik olarak doldurulmayan tüm görünümleri importantForAutofill=no
ile etiketleyin. Ayrıca etkinliğin tamamını importantForAutofill=noExcludeDescendants
ile etiketleyebilirsiniz.
Boyutu değiştirilen iletişim kutuları otomatik doldurma için dikkate alınmaz
Android 8.1 (API düzeyi 27) ve önceki sürümlerde, ileti kutusunda bir görünüm zaten görüntülendikten sonra yeniden boyutlandırılırsa bu 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, hizmet görünümleri dolduramaz.
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
sınıfından devralan sınıfın onWindowAttributesChanged()
yöntemine kaydedin. Ardından, kayıtlı parametrelerin token
özelliğini, onAttachedToWindow()
yöntemindeki üst etkinliğin token
özelliğiyle değiştirin.
Aşağıdaki kod snippet'inde bu geçici çözümü uygulayan bir sınıf gösterilmektedir:
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 için aşağıdaki kod snippet'inde, otomatik doldurma özelliğinin cihazda desteklenip desteklenmediğinin ve mevcut kullanıcı için etkinleştirilip etkinleştirilmediğinin ve bu geçici çözümün gerekli olup olmadığının nasıl kontrol edileceği gösterilmektedir:
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(); } }
Uygulamanızı otomatik doldurma özelliğiyle test etme
Uygulamanızı otomatik doldurma hizmetleriyle çalışacak şekilde optimize ettikten sonra otomatik doldurma hizmetleriyle istediğiniz gibi çalışıp çalışmadığını test edin.
Uygulamanızı test etmek için bir emülatör veya Android 8.0 (API düzeyi 26) veya sonraki sürümleri çalıştıran fiziksel bir cihaz kullanın. Emülatör oluşturma hakkında daha fazla bilgi için Sanal cihazlar oluşturma ve yönetme konusuna bakın.
Otomatik doldurma hizmeti yükleme
Uygulamanızı otomatik doldurma ile test edebilmek için otomatik doldurma hizmetleri sunan başka bir uygulama yüklemeniz gerekir. Bu amaçla bir üçüncü taraf uygulaması kullanabilirsiniz ancak üçüncü taraf hizmetlerine kaydolmanız gerekmediği için örnek bir otomatik doldurma hizmeti kullanmak daha kolaydır.
Uygulamanızı otomatik doldurma hizmetleriyle test etmek için Java'daki Android otomatik doldurma çerçevesi örneğini kullanabilirsiniz. Örnek uygulama, iş akışını uygulamanızla kullanmadan önce test etmek için kullanabileceğiniz bir otomatik doldurma hizmeti ve istemci Activity
sınıfları sağlar. Bu sayfada android-AutofillFramework örnek uygulamasına referans verilmektedir.
Uygulamayı yükledikten sonra Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek emülatör sistem ayarlarında otomatik doldurma hizmetini etkinleştirin.
Veri gereksinimlerini analiz etme
Uygulamanızı otomatik doldurma hizmetiyle test etmek için hizmetin uygulamanızı doldurmak amacıyla kullanabileceği verilere sahip olması gerekir. Hizmetin ayrıca, uygulamanızın görünümlerinde ne tür verilerin beklendiğini de anlaması gerekir. Örneğin, uygulamanız kullanıcı adı bekleyen bir görünüme sahipse hizmetin, kullanıcı adı ve görünümün bu tür veriler beklediğini anlamasını sağlayacak bir mekanizma içeren veri kümesine sahip olması gerekir.
android:autofillHints
özelliğini ayarlayarak hizmete, görünümlerinizde ne tür verilerin beklendiğini bildirin. Bazı hizmetler, veri türünü belirlemek için gelişmiş sezgisel yöntemler kullanır. Örnek uygulama gibi diğer hizmetler ise bu bilgileri sağlamak için geliştiriciye güvenir. Otomatik doldurma ile 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 şartlarını analiz ettikten sonra testinizi çalıştırabilirsiniz. Bu test, test verilerini otomatik doldurma hizmetine kaydetmeyi ve uygulamanızda otomatik doldurmayı tetiklemeyi içerir.
Hizmete veri kaydetme
Şu anda etkin olan otomatik doldurma hizmetine veri kaydetmek için aşağıdakileri yapın:
- Testiniz 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 sağlar.
- İhtiyacınız olan veri türünü içeren görünüme dokunun.
- Görüntüye bir değer girin.
- Oturum aç veya Gönder gibi bir onay düğmesine dokunun. Genellikle, hizmet verileri kaydetmeden önce formu göndermeniz gerekir.
- Sistem iletişim kutusunda izin isteğini doğrulayın. Sistem iletişim kutusunda, şu anda etkin olan hizmetin adı gösterilir ve testinizde kullanmak istediğiniz hizmetin bu olup olmadığı sorulur. Hizmeti kullanmak istiyorsanız Kaydet'e dokunun.
Android izin iletişim kutusunu göstermiyorsa veya hizmet, testinizde kullanmak istediğiniz hizmet değilse hizmetin şu anda sistem ayarlarında etkin olup olmadığını kontrol edin.
Uygulamanızda otomatik doldurmayı tetikleme
Uygulamanızda otomatik doldurmayı tetiklemek için aşağıdakileri yapın:
- Uygulamanızı açın ve test etmek istediğiniz görüntülemelerin bulunduğu etkinliğe gidin.
- Doldurulması gereken görünüme dokunun.
- 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österir.
- Kullanmak istediğiniz verileri içeren veri kümesine dokunun. Bu görünüm, hizmette daha önce depolanan verileri gösterir.
Android otomatik doldurma kullanıcı arayüzünü göstermiyorsa 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çinView
sınıfındaAUTOFILL_HINT
ile başlayan sabitlere bakın. android:importantForAutofill
özelliğinin, doldurulması gereken görünümdeno
dışında bir değere veya görünümde ya da üst öğelerinden birinenoExcludeDescendants
dışında bir değere ayarlanıp ayarlanmadığını kontrol edin.