Standart görünümleri kullanan uygulamalar, özel yapılandırma gerektirmeden otomatik doldurma çerçevesiyle çalışır. 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ılmış olmalı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 birlikte sunulsa 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 birlikte gelmeyebileceğinden, emülatör kullanırken otomatik doldurma hizmetini açıkça ayarlayın.
Ö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 için emülatör yapılandırma hakkında daha fazla bilgi edinmek istiyorsanız Uygulamanızı otomatik doldurma ile test etme başlıklı makaleyi inceleyin.
Görünümler için Etkinlik Bağlamı'nı kullanma
Otomatik doldurma hizmetinin düzgün çalışması için etkinlik bağlamı gerekir. Bir görünümü örneklendirirken bağlam olarak Activity kullanın. Böylece görünüm, otomatik olarak doğru şekilde doldurulabilir.
Otomatik doldurma için ipuçları sağlama
Otomatik doldurma hizmeti, sezgisel yöntemleri kullanarak her görünümün türünü belirler. Ancak uygulamanız bu sezgisel yöntemleri kullanıyorsa uygulamanızı güncellediğinizde 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, bir EditText için "password" ipucu ayarlanmaktadı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 etme
Otomatik doldurma çerçevesi, ipuçlarını doğrulamaz. İpuçları, otomatik doldurma hizmetine değişiklik veya doğrulama yapılmadan iletilir. Herhangi bir 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 giriş bilgileri
Giriş formuna AUTOFILL_HINT_USERNAME ve AUTOFILL_HINT_PASSWORD gibi hesap giriş bilgisi ipuçları ekleyebilirsiniz.
Yeni bir hesap oluştururken 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ı bilgileri istenirken 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_DATEkullanın. - Geçerlilik bitiş tarihinin her bir bölümü için farklı bir görünüm kullanıyorsanız her bir görünüm için sırasıyla
AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY,AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTHveAUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEARkullanabilirsiniz.
Fiziksel adres
Fiziksel adres form alanları için aşağıdaki gibi ipuçları kullanabilirsiniz:
- Tek bir görünümdeki adres için
AUTOFILL_HINT_POSTAL_ADDRESSkullanı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_NAMEkullanın. - Bir adın farklı bölümleri için ayrı görünümler kullanıyorsanız aşağıdakilerden herhangi birini kullanabilirsiniz:
Telefon numaraları
Telefon numaraları için aşağıdakileri kullanabilirsiniz:
- Tek bir görünümde tam telefon numarası isterken
AUTOFILL_HINT_PHONE_NUMBERkullanın. - Telefon numarasının farklı bölümleri için ayrı görünümler kullanıyorsanız aşağıdakilerden herhangi birini kullanabilirsiniz:
Tek kullanımlık şifre (OTP)
Tek bir 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 hanesiyle eşleştiği birden fazla görünüm için
generateSmsOtpHintForCharacterPosition()
yöntemini kullanarak karakter başına ipuçları oluşturabilirsiniz.
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çması, ilgili Android uygulamanızda oturum açarken giriş kimlik bilgilerinin otomatik doldurma için kullanılabilir olması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 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 başlıklı makaleyi inceleyin.
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'ne giderek otomatik doldurmayı etkinleştirebilir veya devre dışı bırakabilir ve otomatik doldurma hizmetini değiştirebilirler. Uygulamanız, kullanıcının otomatik doldurma ayarlarını geçersiz kılamaz ancak otomatik doldurma kullanıcı tarafından kullanılabiliyorsa uygulamanıza veya uygulamanızın belirli görünümlerine ek otomatik doldurma işlevi uygulayabilirsiniz.
Örneğin, kullanıcı için otomatik doldurma etkinleştirilmişse TextView, taşma menüsünde bir otomatik doldurma girişi gösterir. Kullanıcı için otomatik doldurma özelliğinin etkin olup olmadığını kontrol etmek istiyorsanız AutofillManager nesnesinin isEnabled() yöntemini çağırın.
Kayıt ve giriş deneyiminizin otomatik doldurma özelliğini kullanmayan kullanıcılar için optimize edildiğinden emin olmak istiyorsanız One Tap ile oturum açma özelliğini uygulayın.
Otomatik doldurma isteğini zorunlu kılma
Bazen bir kullanıcı işlemine yanıt olarak otomatik doldurma isteğini zorunlu kılmanız gerekir. Örneğin, kullanıcı görünüme dokunup basılı tuttuğunda TextView bir otomatik doldurma menü öğesi sunar.
Aşağıdaki kod örneğinde, 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ü kullanma
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 faydalı olabilir. Örneğin, 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ü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ı bir veri türü kullanıyorsanız EditText sınıfından devralınan 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 Seçicileri otomatik doldurma ile kullanma başlıklı makaleyi inceleyin.
Otomatik doldurma bağlamını tamamlama
Otomatik doldurma çerçevesi, otomatik doldurma bağlamı tamamlandıktan sonra "Otomatik doldurma için kaydedilsin mi?" iletişim kutusunu göstererek kullanıcı girişini daha sonra kullanılmak üzere kaydeder. Genellikle bir etkinlik bittiğinde otomatik doldurma bağlamı da biter. Ancak çerçeveyi açıkça bilgilendirmeniz 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 durumlarda, AutofillManager.commit() yöntemini ç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ünü içeren görünümler gibi sanal alt öğelerin kapsayıcısı olarak işlev görür. Bu görünümlerin, otomatik doldurma çerçevesiyle çalışabilmesi için API'yi kullanarak uygulamada kullanılan bilgilerin yapısını belirtmesi gerekir.
Uygulamanız özel görünümler kullanı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 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 doldurma özelliğinin çalışması için gereken meta verileri tanımlayabilir. Özel görünümünüzün, otomatik doldurma çerçevesiyle çalışmak için meta verileri uygun şekilde yönettiğinden emin olun. Özel görünümünüz aşağıdaki işlemleri yapmalıdır:
- Çerçevenin uygulamanıza gönderdiği otomatik doldurma değerini işleyin.
- Otomatik doldurma türünü ve değerini çerçeveye sağlayın.
Otomatik doldurma tetiklendiğinde otomatik doldurma çerçevesi, görünümünüzde autofill() yöntemini ç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() yöntemini uygulayın.
Görünümünüz, sırasıyla getAutofillType() ve getAutofillValue() yöntemlerini geçersiz kılarak bir otomatik doldurma türü ve değeri belirtmelidir.
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.
Bu gibi durumlarda getAutofillType(), AUTOFILL_TYPE_NONE değerini döndürmeli, getAutofillValue(), null değerini döndürmeli ve autofill() hiçbir şey yapmamalıdır.
Aşağıdaki durumlarda, çerçevenin düzgün çalışması 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ünüm düzenlenebiliyorsa AutofillManager nesnesinde notifyValueChanged() yöntemini çağırarak değişiklikleri otomatik doldurma çerçevesine bildirin.
Özel görünüm hassas veriler içeriyor
E-posta adresleri, kredi kartı numaraları ve şifreler gibi kişisel veri (PII) içeren görünümler hassas olarak işaretlenmelidir.
Genel olarak, içeriği statik kaynaklardan gelen görünümler hassas veriler içermezken içeriği dinamik olarak ayarlanan görünümler hassas veriler 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, varsayılan olarak tüm verilerin hassas olduğunu varsayar. Hassas olmayan verileri işaretleyebilirsiniz.
Bir görünümün hassas veriler içerip içermediğini işaretlemek için onProvideAutofillStructure() yöntemini uygulayın ve ViewStructure nesnesinde setDataIsSensitive() yöntemini ç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 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. Çünkü otomatik doldurma hizmeti, görünümü doldurmak için kullanılabilen seçenekleri bildiğinde daha iyi sonuçlar verebilir.
Spinner gibi bir bağdaştırıcı kullanan görünümler de benzer bir durumdur. Örneğin, kredi kartı son kullanma tarihi alanlarında kullanılmak üzere geçerli yıla göre dinamik olarak oluşturulan yılları sağlayan bir döndürücü, yıl listesi sağlamak için Adapter arayüzünün getAutofillOptions() yöntemini uygulayabilir.
ArrayAdapter kullanan görünümler, değer listeleri de 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ıya sahip özel görünümler
Otomatik doldurma çerçevesi, uygulamanızın kullanıcı arayüzündeki bilgileri düzenleyip kaydedebilmek için bir görünüm yapısı gerektirir. Aşağıdaki durumlarda görünüm yapısı çerçeve tarafından kullanılamaz:
- Uygulama, kullanıcı arayüzünü oluşturmak için OpenGL gibi düşük seviyeli bir oluşturma motoru kullanıyordur.
- Uygulama, kullanıcı arayüzünü çizmek için
Canvasörneğini kullanır.
Bu durumlarda, onProvideAutofillVirtualStructure() arayüzünü uygulayarak ve aşağıdaki adımları izleyerek bir görünüm yapısı belirtebilirsiniz:
addChildCount()yöntemini çağırarak görünüm yapısının alt öğe sayısını artırın.newChild()numarasını arayarak çocuk ekleyin.setAutofillId()yöntemini çağırarak alt öğe için otomatik doldurma kimliğini ayarlayın.- Otomatik doldurma değeri ve türü gibi ilgili özellikleri ayarlayın.
- Sanal alt öğedeki veriler hassassa
setDataIsSensitive()öğesinetruedeğerini, aksi takdirdefalsedeğerini iletin.
Aşağıdaki kod snippet'i, sanal yapıda nasıl yeni bir alt öğe oluşturulacağını gösterir:
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 öğelerdeki odak değişirse
AutofillManagernesnesindenotifyViewEntered()venotifyViewExited()yöntemlerini çağırın. - Bir alt öğenin değeri değişirse
AutofillManagernesnesindenotifyValueChanged()yöntemini çağırın. - Kullanıcı, iş akışındaki bir adımı tamamladığı için (ör. giriş formunu kullanarak oturum açtığında) görünüm hiyerarşisi artık kullanılamıyorsa
AutofillManagernesnesindecommit()yöntemini çağırın. - Kullanıcı, iş akışındaki bir adımı iptal ettiği için (ör. giriş formunu temizleyen bir düğmeye dokunduğunda) görünüm hiyerarşisi geçerli değilse
AutofillManagernesnesindecancel()yöntemini çağırın.
Otomatik doldurma etkinliklerinde geri çağırmaları kullanma
Uygulamanız kendi otomatik tamamlama görünümlerini sağlıyorsa kullanıcı arayüzü otomatik doldurma imkanındaki değişikliklere yanıt olarak 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ünümlerle kullanabileceği bir childId parametresi içeren aşırı yüklenmiş bir sürümü de vardır. Kullanılabilir durumlar, geri çağırmada sabitler olarak tanımlanır.
AutofillManager sınıfının registerCallback() yöntemini kullanarak geri çağırma kaydedebilirsiniz. Aşağıdaki kod örneğinde, otomatik doldurma etkinlikleri için geri çağırma işlevinin nasıl tanımlanacağı 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ırmanız gerektiğinde
unregisterCallback()
yöntemini kullanın.
Otomatik doldurma vurgulanan çizilebilir öğesini özelleştirme
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 üzerinde bir Drawable oluşturur. Varsayılan olarak bu çizilebilir, arka planları çizmek için kullanılan tema renginden biraz daha koyu, yarı saydam bir renge sahip düz bir dikdörtgendir. Çizilebilir öğenin değiştirilmesi gerekmez ancak uygulama veya etkinlik tarafından kullanılan temanın android:autofilledHighlight öğesi geçersiz kılınarak özelleştirilebilir. Bu örnekte gösterildiği gibi:
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ı yapma
Otomatik doldurma hizmeti, uygulamanızdaki alanları doldurmadan önce kullanıcının kimlik doğrulamasını gerektirebilir. Bu durumda Android sistemi, hizmetin kimlik doğrulama etkinliğini etkinliğinizin yığınının bir parçası olarak 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 etkinliğin görünüm yapısının korunduğundan emin olmanız gerekir. Örneğin, görünüm yapısını onStart() veya onResume() yerine onCreate() içinde oluşturabilirsiniz.
AutofillFramework örneğindeki HeuristicsService'i kullanarak ve doldurma yanıtı kimlik doğrulaması gerektirecek şekilde yapılandırarak bir otomatik doldurma hizmeti kimlik doğrulaması gerektirdiğinde uygulamanızın nasıl davrandığını doğrulayabilirsiniz. Bu sorunu taklit 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 kapsayıcılar, büyük veri kümelerine dayalı kaydırılabilir öğe listeleri göstermesi gereken uygulamalar için kullanışlıdır. Kapsayıcı kaydırıldıkça sistem, düzendeki görünümleri yeniden kullanır ancak görünümler yeni içerik barındırır.
Geri dönüştürülmüş bir görünümün ilk içerikleri 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 kimlikleri aynı kalır. Bu durum, 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öntemleri 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ı giderme
Bu bölümde, Otomatik Doldurma Çerçevesi'ndeki 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 (API düzeyi 27) sürümlerinde otomatik doldurma, belirli senaryolarda uygulamanızın kilitlenmesine neden olabilir. Olası sorunları önlemek için otomatik olarak doldurulmayan görünümleri importantForAutofill=no ile etiketleyin. Ayrıca, etkinliğin tamamını 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 hizmet, görünümleri dolduramaz.
Bu sorunu çözmek için iletişim kutusu penceresi parametrelerinin token özelliğini, iletişim kutusunu oluşturan etkinliğin token özelliğiyle değiştirin. Otomatik doldurmanın etkinleştirildiğini doğruladıktan sonra, pencere parametrelerini Dialog sınıfından devralan sınıfın onWindowAttributesChanged() yöntemine kaydedin. Ardından, onAttachedToWindow() yönteminde kaydedilen parametrelerin token özelliğini ü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();
}
}
Aşağıdaki kod snippet'i, gereksiz işlemlerden kaçınmak için otomatik doldurmanın cihazda desteklenip desteklenmediğini ve mevcut kullanıcı için etkinleştirilip etkinleştirilmediğini, ayrıca bu geçici çö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();
}
}
Uygulamanızı otomatik doldurma ile test etme
Uygulamanızı otomatik doldurma hizmetleriyle çalışacak şekilde optimize ettikten sonra, otomatik doldurma hizmetleriyle amaçlandığı gibi çalışıp çalışmadığını test edin.
Uygulamanızı test etmek için Android 8.0 (API düzeyi 26) veya sonraki bir sürümün yüklü olduğu 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 başlıklı makaleyi inceleyin.
Otomatik doldurma hizmeti yükleme
Uygulamanızı otomatik doldurma ile test edebilmek için otomatik doldurma hizmetleri sağlayan başka bir uygulama yüklemeniz gerekir. Bu amaçla üçüncü taraf uygulaması kullanabilirsiniz ancak üçüncü taraf hizmetlerine kaydolmanız gerekmemesi 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, 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ınmıştır.
Uygulamayı yükledikten sonra Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek emülatörün 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 için 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ızda kullanıcı adı bekleyen bir görünüm varsa hizmetin, kullanıcı adı içeren bir veri kümesine ve görünümün bu tür verileri beklediğini bilmek 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ş sezgisel yöntemler kullanır. Örnek uygulama gibi diğer hizmetler ise bu bilgileri sağlamak için geliştiriciye güvenir. Otomatik doldurmayla alakalı görünümlerde android:autofillHints özelliğini ayarlarsanız uygulamanız otomatik doldurma hizmetleriyle daha iyi çalışır.
Testinizi çalıştırma
Veri gereksinimlerini analiz ettikten sonra testinizi çalıştırabilirsiniz. Bu test, test verilerini otomatik doldurma hizmetine kaydetmeyi ve uygulamanızda otomatik doldurmayı tetiklemeyi içerir.
Verileri hizmete 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 uygulamayı açın. android-AutofillFramework örnek uygulaması, kredi kartı numaraları ve kullanıcı adları gibi çeşitli veri türlerini bekleyen görünümlerle kullanıcı arayüzü sağlar.
- İhtiyacınız olan veri türünü içeren görünüme dokunun.
- Görünüme bir değer girin.
- Oturum aç veya Gönder gibi onay düğmesine dokunun. Genellikle hizmetin verileri kaydetmesi için formu göndermeniz gerekir.
- Sistem iletişim kutusundan izin isteğini doğrulayın. Sistem iletişim kutusunda, 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 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ünümlerin 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. Görünüm, daha önce hizmette 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çinViewsınıfındaAUTOFILL_HINTön ekine sahip sabitlere bakın. - Doldurulması gereken görünümde
android:importantForAutofillözelliğininnodışında bir değere ayarlandığından veya görünümde ya da üst öğelerinden birindenoExcludeDescendantsdışında bir değere ayarlandığından emin olun.