แอปที่ใช้มุมมองมาตรฐานจะทำงานร่วมกับเฟรมเวิร์กการป้อนข้อความอัตโนมัติได้โดยไม่ต้องมีการกําหนดค่าพิเศษ คุณยังเพิ่มประสิทธิภาพการทำงานของแอป โดยใช้เฟรมเวิร์กได้ด้วย
ตั้งค่าสภาพแวดล้อมการป้อนข้อความอัตโนมัติ
หัวข้อนี้จะอธิบายวิธีการตั้งค่าฟังก์ชันการทำงานพื้นฐานของการป้อนข้อความอัตโนมัติสำหรับแอป
กำหนดค่าบริการป้อนข้อความอัตโนมัติ
คุณต้องกำหนดค่าบริการป้อนข้อความอัตโนมัติในอุปกรณ์เพื่อให้แอปใช้เฟรมเวิร์กป้อนข้อความอัตโนมัติได้ แม้ว่าโทรศัพท์และแท็บเล็ตส่วนใหญ่ที่ใช้ Android 8.0 (API ระดับ 26) ขึ้นไปจะมาพร้อมกับบริการป้อนข้อความอัตโนมัติ เราขอแนะนำให้คุณใช้บริการทดสอบเมื่อทดสอบแอป เช่น บริการป้อนข้อความอัตโนมัติในตัวอย่างเฟรมเวิร์กการป้อนข้อความอัตโนมัติของ Android เมื่อใช้โปรแกรมจำลอง ให้ตั้งค่าบริการป้อนข้อความอัตโนมัติอย่างชัดเจน เนื่องจากโปรแกรมจำลองอาจไม่มีบริการเริ่มต้น
หลังจากติดตั้งบริการป้อนข้อความอัตโนมัติสำหรับการทดสอบจากแอปตัวอย่างแล้ว ให้เปิดใช้บริการป้อนข้อความอัตโนมัติโดยไปที่การตั้งค่า > ระบบ > ภาษาและการป้อนข้อมูล > ขั้นสูง > การช่วยเหลือในการป้อนข้อมูล > บริการป้อนข้อความอัตโนมัติ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าโปรแกรมจำลองเพื่อทดสอบการป้อนข้อความอัตโนมัติได้ที่ทดสอบแอปด้วยการป้อนข้อความอัตโนมัติ
แสดงคำแนะนำสำหรับการป้อนข้อความอัตโนมัติ
บริการป้อนข้อความอัตโนมัติจะกำหนดประเภทของมุมมองแต่ละรายการโดยใช้หลักการทั่วไป อย่างไรก็ตาม หากแอปของคุณใช้วิธีการเดาเหล่านี้ ลักษณะการทํางานของการป้อนข้อความอัตโนมัติอาจเปลี่ยนแปลงโดยไม่คาดคิดเมื่อคุณอัปเดตแอป ให้ระบุคำแนะนำการป้อนข้อความอัตโนมัติเพื่อให้บริการป้อนข้อความอัตโนมัติระบุรูปแบบของแอปได้อย่างถูกต้อง
คุณตั้งค่าคำแนะนำการป้อนข้อความอัตโนมัติได้โดยใช้แอตทริบิวต์android:autofillHints
ตัวอย่างต่อไปนี้ตั้งค่าคำแนะนำ "password"
ใน EditText
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:autofillHints="password" />
นอกจากนี้ คุณยังตั้งค่าคำแนะนำแบบเป็นโปรแกรมได้โดยใช้เมธอด setAutofillHints()
ดังตัวอย่างต่อไปนี้
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);
รวมค่าคงที่ของคำแนะนำที่กําหนดไว้ล่วงหน้า
เฟรมเวิร์กการป้อนข้อความอัตโนมัติไม่ได้ตรวจสอบคำแนะนำ โดยระบบจะส่งต่อคำแนะนำโดยไม่มีการเปลี่ยนแปลงหรือตรวจสอบกับบริการป้อนข้อความอัตโนมัติ แม้ว่าคุณจะใช้ค่าใดก็ได้ แต่คลาส View
และ AndroidX HintConstants
มีรายการค่าคงที่คำแนะนำที่รองรับอย่างเป็นทางการ
การใช้ค่าคงที่เหล่านี้ร่วมกันจะช่วยให้คุณสร้างเลย์เอาต์สำหรับสถานการณ์การป้อนข้อความอัตโนมัติที่พบบ่อยได้ ดังนี้
ข้อมูลเข้าสู่ระบบบัญชี
ในแบบฟอร์มการเข้าสู่ระบบ คุณสามารถใส่คำแนะนำเกี่ยวกับข้อมูลเข้าสู่ระบบของบัญชี เช่น AUTOFILL_HINT_USERNAME
และ AUTOFILL_HINT_PASSWORD
สำหรับการสร้างบัญชีใหม่หรือเมื่อผู้ใช้เปลี่ยนชื่อผู้ใช้และรหัสผ่าน คุณสามารถใช้ AUTOFILL_HINT_NEW_USERNAME
และ AUTOFILL_HINT_NEW_PASSWORD
ข้อมูลบัตรเครดิต
เมื่อขอข้อมูลบัตรเครดิต คุณสามารถใช้คำแนะนำ เช่น
AUTOFILL_HINT_CREDIT_CARD_NUMBER
และ
AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE
สำหรับวันที่หมดอายุของบัตรเครดิต ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้
- หากคุณใช้มุมมองเดียวสำหรับวันที่หมดอายุ ให้ใช้
AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE
- หากใช้มุมมองที่แตกต่างกันสำหรับแต่ละส่วนของวันที่หมดอายุ คุณสามารถใช้
AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY
,AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH
และAUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR
สำหรับมุมมองที่เกี่ยวข้องแต่ละมุมมอง
ที่อยู่จริง
สำหรับช่องแบบฟอร์มที่อยู่จริง คุณสามารถใช้คำแนะนำ เช่น
- สำหรับที่อยู่ในมุมมองเดียว ให้ใช้
AUTOFILL_HINT_POSTAL_ADDRESS
- เมื่อใช้มุมมองแยกกันสำหรับส่วนต่างๆ ของที่อยู่ คุณจะใช้สิ่งต่อไปนี้ได้
ชื่อบุคคล
เมื่อขอชื่อบุคคล คุณสามารถใช้คำแนะนำต่อไปนี้
- หากต้องการป้อนชื่อเต็มของบุคคลโดยอัตโนมัติในมุมมองเดียว ให้ใช้
AUTOFILL_HINT_PERSON_NAME
- หากใช้มุมมองแยกต่างหากสำหรับส่วนต่างๆ ของชื่อ คุณจะใช้รูปแบบต่อไปนี้ก็ได้
หมายเลขโทรศัพท์
สำหรับหมายเลขโทรศัพท์ คุณสามารถใช้รูปแบบต่อไปนี้
- เมื่อขอหมายเลขโทรศัพท์แบบเต็มในมุมมองเดียว ให้ใช้
AUTOFILL_HINT_PHONE_NUMBER
- หากใช้มุมมองแยกกันสำหรับส่วนต่างๆ ของหมายเลขโทรศัพท์ คุณจะใช้รูปแบบใดก็ได้ต่อไปนี้
รหัสผ่านที่สามารถใช้งานได้เพียงครั้งเดียว (OTP)
สำหรับรหัสผ่านที่สามารถใช้งานได้เพียงครั้งเดียวในมุมมองเดียว คุณจะใช้ AUTOFILL_HINT_SMS_OTP
ได้
สำหรับมุมมองหลายรายการที่แต่ละมุมมองแมปกับตัวเลข 1 หลักของ OTP คุณสามารถใช้วิธี generateSmsOtpHintForCharacterPosition()
เพื่อสร้างคำแนะนำสำหรับแต่ละอักขระ
ทำเครื่องหมายช่องว่าสำคัญสำหรับการป้อนข้อความอัตโนมัติ
คุณสามารถรวมช่องแต่ละช่องในแอปไว้ในโครงสร้างมุมมองเพื่อวัตถุประสงค์ในการป้อนข้อความอัตโนมัติ โดยค่าเริ่มต้น มุมมองจะใช้โหมด IMPORTANT_FOR_AUTOFILL_AUTO
ซึ่งช่วยให้ Android ใช้วิธีการหาค่าประมาณเพื่อพิจารณาว่ามุมมองนั้นสำคัญต่อการป้อนข้อความอัตโนมัติหรือไม่
อย่างไรก็ตาม ในกรณีต่อไปนี้ มุมมอง โครงสร้างมุมมอง หรือทั้งกิจกรรมจะไม่สำคัญต่อการป้อนข้อความอัตโนมัติ
- ช่อง
CAPTCHA
ในกิจกรรมการเข้าสู่ระบบ - มุมมองที่ผู้ใช้สร้างเนื้อหา เช่น เครื่องมือแก้ไขข้อความหรือสเปรดชีต
- ยอดดูในกิจกรรมบางอย่างภายในเกม เช่น กิจกรรมที่แสดงการเล่นเกม
คุณตั้งค่าความสำคัญของมุมมองสำหรับการป้อนข้อความอัตโนมัติได้โดยใช้แอตทริบิวต์ android:importantForAutofill
ดังนี้
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:importantForAutofill="no" />
ค่าของ importantForAutofill
อาจเป็นค่าใดค่าหนึ่งต่อไปนี้
auto
- อนุญาตให้ระบบ Android ใช้วิธีการหาค่าประมาณเพื่อพิจารณาว่ามุมมองสำคัญต่อการป้อนข้อความอัตโนมัติหรือไม่
no
- มุมมองนี้ไม่สำคัญสำหรับการป้อนข้อความอัตโนมัติ
noExcludeDescendants
- มุมมองนี้และมุมมองย่อยไม่สำคัญต่อการป้อนข้อความอัตโนมัติ
yes
- มุมมองนี้สำคัญกับการป้อนข้อความอัตโนมัติ
yesExcludeDescendants
- มุมมองนี้สำคัญต่อการป้อนข้อความอัตโนมัติ แต่มุมมองย่อยไม่สำคัญต่อการป้อนข้อความอัตโนมัติ
คุณยังใช้เมธอด setImportantForAutofill()
ได้ด้วย โดยทำดังนี้
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);
คุณสามารถประกาศว่า Use Case ตัวอย่างข้างต้นไม่สำคัญสำหรับการป้อนข้อความอัตโนมัติได้ดังนี้
- ช่อง
CAPTCHA
ในกิจกรรมการเข้าสู่ระบบ: ใช้android:importantForAutofill="no"
หรือIMPORTANT_FOR_AUTOFILL_NO
เพื่อทําเครื่องหมายมุมมองนี้ว่าไม่สําคัญ - มุมมองที่ผู้ใช้สร้างเนื้อหา: ใช้
android:importantForAutofill="noExcludeDescendants"
หรือIMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS
เพื่อทําเครื่องหมายโครงสร้างมุมมองทั้งหมดว่าไม่สําคัญ - การดูในบางกิจกรรมภายในเกม: ใช้
android:importantForAutofill="noExcludeDescendants"
หรือIMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS
เพื่อทำเครื่องหมายโครงสร้างการแสดงผลทั้งหมดว่าไม่สำคัญ
เชื่อมโยงข้อมูลเว็บไซต์และแอปบนอุปกรณ์เคลื่อนที่
บริการป้อนข้อความอัตโนมัติ เช่น ฟีเจอร์ป้อนข้อความอัตโนมัติด้วย Google สามารถแชร์ข้อมูลการเข้าสู่ระบบของผู้ใช้ระหว่างเบราว์เซอร์และอุปกรณ์ Android หลังจากที่แอปและเว็บไซต์เชื่อมโยงกันแล้ว เมื่อผู้ใช้เลือกบริการป้อนข้อความอัตโนมัติเดียวกันในทั้ง 2 แพลตฟอร์ม การลงชื่อเข้าใช้เว็บแอปจะทำให้ระบบป้อนข้อมูลเข้าสู่ระบบให้โดยอัตโนมัติเมื่อผู้ใช้ลงชื่อเข้าใช้แอป Android ที่เกี่ยวข้อง
หากต้องการเชื่อมโยงแอป Android กับเว็บไซต์ ให้โฮสต์ลิงก์เนื้อหาดิจิทัลกับความสัมพันธ์ delegate_permission/common.get_login_creds
ในเว็บไซต์ของคุณ จากนั้นประกาศการเชื่อมโยงในไฟล์ AndroidManifest.xml
ของแอป ดูวิธีการโดยละเอียดเกี่ยวกับวิธีเชื่อมโยงเว็บไซต์กับแอป Android ได้ที่หัวข้อเปิดใช้การลงชื่อเข้าใช้โดยอัตโนมัติในแอปและเว็บไซต์
ทำตามเวิร์กโฟลว์การป้อนข้อความอัตโนมัติให้เสร็จสมบูรณ์
ส่วนนี้จะอธิบายสถานการณ์ที่เฉพาะเจาะจงซึ่งคุณสามารถทำตามขั้นตอนเพื่อปรับปรุงฟังก์ชันการป้อนข้อความอัตโนมัติสำหรับผู้ใช้แอป
ตรวจสอบว่าได้เปิดใช้การป้อนข้อความอัตโนมัติหรือไม่
ผู้ใช้จะเปิดหรือปิดใช้การป้อนข้อความอัตโนมัติ รวมถึงเปลี่ยนบริการป้อนข้อความอัตโนมัติได้โดยไปที่การตั้งค่า > ระบบ > ภาษาและการป้อนข้อมูล > ขั้นสูง > ความช่วยเหลือในการป้อนข้อมูล > บริการป้อนข้อความอัตโนมัติ แอปของคุณลบล้างการตั้งค่าการป้อนข้อความอัตโนมัติของผู้ใช้ไม่ได้ แต่คุณสามารถใช้ฟังก์ชันป้อนข้อความอัตโนมัติเพิ่มเติมในแอป หรือในมุมมองของแอปได้ หากการป้อนข้อความอัตโนมัติพร้อมใช้งานสำหรับผู้ใช้
ตัวอย่างเช่น TextView
จะแสดงรายการป้อนข้อความอัตโนมัติในเมนูรายการเพิ่มเติมหากเปิดใช้การป้อนข้อความอัตโนมัติสำหรับผู้ใช้ หากต้องการตรวจสอบว่าเปิดใช้การป้อนข้อความอัตโนมัติให้กับผู้ใช้หรือไม่ ให้เรียกใช้เมธอด isEnabled()
ของออบเจ็กต์ AutofillManager
หากต้องการให้ประสบการณ์การลงชื่อสมัครใช้และเข้าสู่ระบบได้รับการเพิ่มประสิทธิภาพสำหรับผู้ใช้ที่ไม่ได้ใช้ฟีเจอร์ป้อนข้อความอัตโนมัติ ให้ใช้การลงชื่อเข้าใช้ด้วย One Tap
บังคับใช้คำขอการป้อนข้อความอัตโนมัติ
บางครั้งคุณอาจต้องบังคับให้ส่งคำขอป้อนข้อความอัตโนมัติเพื่อตอบสนองต่อการดำเนินการของผู้ใช้ เช่น TextView
เสนอรายการเมนูแบบป้อนข้อความอัตโนมัติเมื่อผู้ใช้แตะและกดค้างไว้ที่มุมมอง
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีบังคับให้ส่งคําขอป้อนข้อความอัตโนมัติ
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); } }
นอกจากนี้ คุณยังใช้เมธอด cancel()
เพื่อยกเลิกบริบทการป้อนข้อความอัตโนมัติปัจจุบันได้ด้วย ซึ่งจะมีประโยชน์หากคุณมีปุ่มที่ล้างช่องในหน้าการเข้าสู่ระบบ
ใช้ประเภทการป้อนข้อความอัตโนมัติที่ถูกต้องสำหรับข้อมูลในการควบคุมเครื่องมือเลือก
เครื่องมือเลือกอาจเป็นประโยชน์กับการป้อนข้อความอัตโนมัติโดยการระบุ UI ที่ช่วยให้ผู้ใช้เปลี่ยนค่าของช่องที่เก็บข้อมูลวันที่หรือเวลาได้ ตัวอย่างเช่น ในรูปแบบบัตรเครดิต เครื่องมือเลือกวันที่ช่วยให้ผู้ใช้ป้อนหรือเปลี่ยนแปลงวันที่หมดอายุของบัตรเครดิตได้ อย่างไรก็ตาม คุณต้องใช้มุมมองอื่น เช่น EditText
เพื่อแสดงข้อมูลเมื่อไม่เห็นเครื่องมือเลือก
โดยค่าเริ่มต้น ออบเจ็กต์ EditText
จะคาดหวังว่าจะมีข้อมูลป้อนข้อความอัตโนมัติประเภท AUTOFILL_TYPE_TEXT
หากคุณใช้ข้อมูลประเภทอื่น ให้สร้างมุมมองที่กําหนดเองซึ่งรับค่าจาก EditText
และใช้เมธอดที่จําเป็นสําหรับจัดการข้อมูลประเภทที่เกี่ยวข้อง เช่น หากคุณมีช่องวันที่ ให้ใช้เมธอดที่มีตรรกะที่จัดการค่าประเภท AUTOFILL_TYPE_DATE
อย่างถูกต้อง
เมื่อคุณระบุประเภทข้อมูลป้อนอัตโนมัติ บริการป้อนอัตโนมัติจะสร้างการแสดงข้อมูลที่เหมาะสมซึ่งแสดงในมุมมอง ดูข้อมูลเพิ่มเติมได้ที่ใช้เครื่องมือเลือกที่มีการป้อนข้อความอัตโนมัติ
เขียนบริบทการป้อนข้อความอัตโนมัติให้เสร็จ
เฟรมเวิร์กการป้อนข้อความอัตโนมัติจะบันทึกข้อมูลที่ผู้ใช้ป้อนไว้เพื่อใช้ในอนาคตโดยแสดงกล่องโต้ตอบ "บันทึกเพื่อป้อนข้อความอัตโนมัติไหม" หลังจากที่บริบทการป้อนข้อความอัตโนมัติเสร็จสมบูรณ์ โดยปกติแล้ว บริบทการป้อนข้อความอัตโนมัติจะเสร็จสิ้นเมื่อกิจกรรมหนึ่งๆ เสร็จสิ้น อย่างไรก็ตาม ในบางสถานการณ์ คุณจะต้องแจ้งเฟรมเวิร์กอย่างชัดเจน เช่น หากคุณใช้กิจกรรมเดียวกันแต่มีการแยกส่วนที่แตกต่างกันทั้งสําหรับหน้าจอการเข้าสู่ระบบและหน้าจอเนื้อหา ในกรณีเหล่านี้ คุณสามารถสิ้นสุดบริบทได้อย่างชัดเจนโดยเรียกใช้ AutofillManager.commit()
การรองรับมุมมองที่กำหนดเอง
มุมมองที่กำหนดเองสามารถระบุข้อมูลเมตาที่แสดงต่อเฟรมเวิร์กการป้อนข้อความอัตโนมัติได้โดยใช้ autofill API มุมมองบางรายการทำหน้าที่เป็นคอนเทนเนอร์ขององค์ประกอบย่อยเสมือนจริง เช่น มุมมองที่มี UI ที่แสดงผลด้วย OpenGL มุมมองเหล่านี้ต้องใช้ API เพื่อระบุโครงสร้างของข้อมูลที่ใช้ในแอปก่อนจึงจะทํางานร่วมกับเฟรมเวิร์กการป้อนข้อความอัตโนมัติได้
หากแอปใช้มุมมองที่กำหนดเอง ลองพิจารณาสถานการณ์ต่อไปนี้
- มุมมองที่กําหนดเองจะมีโครงสร้างมุมมองมาตรฐานหรือโครงสร้างมุมมองเริ่มต้น
- มุมมองที่กําหนดเองมีโครงสร้างเสมือนหรือโครงสร้างมุมมองที่เฟรมเวิร์กการเติมข้อความอัตโนมัติใช้ไม่ได้
มุมมองที่กำหนดเองซึ่งมีโครงสร้างมุมมองมาตรฐาน
มุมมองที่กำหนดเองสามารถกำหนดข้อมูลเมตาที่การป้อนอัตโนมัติต้องใช้ในการทำงาน ตรวจสอบว่ามุมมองที่กำหนดเองจัดการข้อมูลเมตาอย่างเหมาะสมเพื่อทำงานกับเฟรมเวิร์กการป้อนข้อความอัตโนมัติ มุมมองที่กำหนดเองจะต้องดำเนินการต่อไปนี้
- จัดการค่าป้อนอัตโนมัติที่เฟรมเวิร์กส่งไปยังแอป
- ระบุประเภทและค่าการป้อนข้อความอัตโนมัติให้กับเฟรมเวิร์ก
เมื่อเรียกใช้การป้อนข้อความอัตโนมัติ เฟรมเวิร์กการป้อนข้อความอัตโนมัติจะเรียกใช้ autofill()
ในมุมมองและส่งค่าที่มุมมองของคุณต้องใช้ ใช้ autofill()
เพื่อระบุวิธีที่มุมมองที่กําหนดเองจัดการค่าป้อนข้อความอัตโนมัติ
มุมมองต้องระบุประเภทและค่าการป้อนข้อความอัตโนมัติโดยการลบล้างเมธอด getAutofillType()
และ getAutofillValue()
ตามลำดับ
สุดท้าย การป้อนข้อความอัตโนมัติต้องไม่ป้อนข้อมูลในมุมมองหากผู้ใช้ไม่สามารถระบุค่าสำหรับมุมมองในสถานะปัจจุบัน เช่น หากมุมมองถูกปิดใช้
ในกรณีเหล่านี้ getAutofillType()
ต้องแสดงผลเป็น AUTOFILL_TYPE_NONE
, getAutofillValue()
ต้องแสดงผลเป็น null
และ autofill()
ต้องไม่แสดงผล
กรณีต่อไปนี้ต้องใช้ขั้นตอนเพิ่มเติมเพื่อให้ทํางานได้อย่างถูกต้องภายในเฟรมเวิร์ก
- มุมมองที่กำหนดเองสามารถแก้ไขได้
- มุมมองที่กำหนดเองมีข้อมูลที่ละเอียดอ่อน
มุมมองที่กำหนดเองจะแก้ไขได้
หากมุมมองแก้ไขได้ ให้แจ้งเฟรมเวิร์กการเติมข้อความอัตโนมัติเกี่ยวกับการเปลี่ยนแปลงโดยเรียกใช้ notifyValueChanged()
ในออบเจ็กต์ AutofillManager
มุมมองที่กําหนดเองมีข้อมูลที่ละเอียดอ่อน
หากข้อมูลพร็อพเพอร์ตี้มีข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ (PII) เช่น อีเมล หมายเลขบัตรเครดิต และรหัสผ่าน ข้อมูลพร็อพเพอร์ตี้นั้นต้องได้รับการทําเครื่องหมายว่า "มีความละเอียดอ่อน"
โดยทั่วไป มุมมองที่มีเนื้อหามาจากทรัพยากรแบบคงที่จะไม่มีข้อมูลที่ละเอียดอ่อน ขณะที่การดูที่ตั้งค่าเนื้อหาแบบไดนามิกอาจมีข้อมูลที่ละเอียดอ่อน เช่น ป้ายกำกับที่มีข้อความว่าป้อนชื่อผู้ใช้จะไม่มีข้อมูลที่ละเอียดอ่อน แต่ป้ายกำกับที่มีข้อความว่าสวัสดี คุณ John จะมีข้อมูลที่ละเอียดอ่อน
เฟรมเวิร์กการป้อนข้อความอัตโนมัติจะถือว่าข้อมูลทั้งหมดมีความละเอียดอ่อนโดยค่าเริ่มต้น คุณสามารถทําเครื่องหมายข้อมูลที่ไม่ใช่ข้อมูลที่ละเอียดอ่อนได้
หากต้องการทำเครื่องหมายว่ามุมมองมีข้อมูลที่ละเอียดอ่อนหรือไม่ ให้ใช้ onProvideAutofillStructure()
และเรียกใช้ setDataIsSensitive()
ในออบเจ็กต์ ViewStructure
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีทำเครื่องหมายข้อมูลในโครงสร้างข้อมูลพร็อพเพอร์ตี้ว่าไม่ละเอียดอ่อน
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); }
หากมุมมองยอมรับเฉพาะค่าที่กำหนดไว้ล่วงหน้า คุณสามารถใช้วิธี setAutofillOptions()
เพื่อตั้งค่าตัวเลือกที่ใช้ป้อนข้อมูลในมุมมองโดยอัตโนมัติได้ โดยเฉพาะอย่างยิ่ง มุมมองที่มีประเภทการป้อนข้อความอัตโนมัติเป็น AUTOFILL_TYPE_LIST
ต้องใช้วิธีนี้ เนื่องจากบริการป้อนข้อความอัตโนมัติจะทำงานได้ดีขึ้นหากทราบตัวเลือกที่ใช้กรอกข้อมูลในมุมมอง
มุมมองที่ใช้อะแดปเตอร์ เช่น Spinner
ก็เป็นกรณีที่คล้ายกัน ตัวอย่างเช่น Spinner ที่แสดงปีซึ่งสร้างขึ้นแบบไดนามิกตามปีปัจจุบันเพื่อใช้ในช่องวันหมดอายุของบัตรเครดิตสามารถใช้เมธอด getAutofillOptions()
ของอินเทอร์เฟซ Adapter
เพื่อแสดงรายการปี
มุมมองที่ใช้ ArrayAdapter
ยังระบุรายการค่าได้ด้วย ArrayAdapter
จะตั้งค่าตัวเลือกการป้อนข้อความอัตโนมัติสําหรับทรัพยากรแบบคงที่โดยอัตโนมัติ
หากคุณระบุค่าแบบไดนามิก ให้ลบล้าง getAutofillOptions()
มุมมองที่กำหนดเองที่มีโครงสร้างเสมือนจริง
เฟรมเวิร์กการป้อนอัตโนมัติต้องมีโครงสร้างมุมมองก่อนจึงจะแก้ไขและบันทึกข้อมูลใน UI ของแอปได้ เฟรมเวิร์กจะใช้โครงสร้างมุมมองไม่ได้ในกรณีต่อไปนี้
ในกรณีเหล่านี้ คุณสามารถระบุโครงสร้างมุมมองได้โดยการใช้ onProvideAutofillVirtualStructure()
และทําตามขั้นตอนต่อไปนี้
- เพิ่มจํานวนรายการย่อยของโครงสร้างมุมมองโดยการเรียกใช้
addChildCount()
- เพิ่มบุตรหลานโดยโทรไปที่
newChild()
- ตั้งค่ารหัสการป้อนข้อความอัตโนมัติสำหรับบุตรหลานโดยโทรหา
setAutofillId()
- ตั้งค่าพร็อพเพอร์ตี้ที่เกี่ยวข้อง เช่น ค่าและประเภทการป้อนข้อความอัตโนมัติ
- หากข้อมูลในบุตรหลานเสมือนมีความละเอียดอ่อน ให้ส่ง
true
ไปยังsetDataIsSensitive()
หรือส่งfalse
ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้างรายการย่อยใหม่ในโครงสร้างเสมือน
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); }
เมื่อองค์ประกอบในโครงสร้างเสมือนมีการเปลี่ยนแปลง ให้แจ้งเฟรมเวิร์กโดยทํางานต่อไปนี้
- หากโฟกัสภายในรายการย่อยมีการเปลี่ยนแปลง ให้เรียกใช้
notifyViewEntered()
และnotifyViewExited()
บนออบเจ็กต์AutofillManager
- หากค่าของรายการย่อยเปลี่ยนแปลง ให้เรียกใช้
notifyValueChanged()
ในออบเจ็กต์AutofillManager
- หากลําดับชั้นของมุมมองไม่พร้อมใช้งานอีกต่อไปเนื่องจากผู้ใช้ทําขั้นตอนในเวิร์กโฟลว์เสร็จแล้ว เช่น เมื่อลงชื่อเข้าใช้โดยใช้แบบฟอร์มการเข้าสู่ระบบ ให้เรียกใช้
commit()
ในออบเจ็กต์AutofillManager
- หากลําดับชั้นของมุมมองไม่ถูกต้องเนื่องจากผู้ใช้ยกเลิกขั้นตอนในเวิร์กโฟลว์ เช่น เมื่อผู้ใช้แตะปุ่มที่ล้างแบบฟอร์มการเข้าสู่ระบบ ให้เรียกใช้
cancel()
ในออบเจ็กต์AutofillManager
ใช้ Callback ในเหตุการณ์ป้อนข้อความอัตโนมัติ
หากแอปของคุณมีมุมมองการเติมข้อความอัตโนมัติของตัวเอง คุณต้องมีกลไกที่บอกให้แอปเปิดหรือปิดใช้มุมมองเพื่อตอบสนองต่อการเปลี่ยนแปลงในความสามารถในการใช้งานการเติมข้อความอัตโนมัติของ UI เฟรมเวิร์กการป้อนข้อความอัตโนมัติมีกลไกนี้ในรูปแบบของ AutofillCallback
คลาสนี้มีเมธอด onAutofillEvent(View, int)
ซึ่งแอปจะเรียกใช้หลังจากมีการเปลี่ยนแปลงสถานะการป้อนข้อความอัตโนมัติที่เชื่อมโยงกับมุมมอง
นอกจากนี้ยังมีเมธอดนี้ซึ่งมีมากเกินไปซึ่งมีพารามิเตอร์ childId
ที่แอปของคุณใช้กับมุมมองเสมือนได้ สถานะที่ใช้ได้จะมีการระบุเป็นค่าคงที่ใน Callback
คุณลงทะเบียน Callback ได้โดยใช้เมธอด registerCallback()
ของคลาส AutofillManager
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีประกาศ Callback สําหรับเหตุการณ์ป้อนข้อความอัตโนมัติ
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; } } });
เมื่อถึงเวลานำ Callback ออก ให้ใช้เมธอด unregisterCallback()
ปรับแต่งรูปภาพที่ไฮไลต์สำหรับการป้อนข้อความอัตโนมัติ
เมื่อระบบป้อนข้อมูลพร็อพเพอร์ตี้โดยอัตโนมัติ แพลตฟอร์มจะแสดงDrawable
เหนือพร็อพเพอร์ตี้เพื่อบ่งบอกว่าระบบป้อนข้อมูลพร็อพเพอร์ตี้โดยอัตโนมัติ โดยค่าเริ่มต้น องค์ประกอบที่วาดได้นี้จะเป็นรูปสี่เหลี่ยมผืนผ้าทึบที่มีสีโปร่งแสงซึ่งเข้มกว่าสีของธีมที่ใช้วาดพื้นหลังเล็กน้อย โฆษณาที่ถอนออกได้นั้นไม่จำเป็นต้องเปลี่ยนแปลง แต่ปรับแต่งได้โดยการลบล้างรายการ android:autofilledHighlight
ของธีมที่แอปพลิเคชันหรือกิจกรรมใช้ ดังที่แสดงในตัวอย่างนี้
<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">
ตรวจสอบสิทธิ์สำหรับการป้อนข้อความอัตโนมัติ
บริการป้อนข้อความอัตโนมัติอาจกำหนดให้ผู้ใช้ตรวจสอบสิทธิ์ก่อนบริการจะกรอกข้อมูลในช่องในแอปได้ ซึ่งในกรณีนี้ ระบบ Android จะเปิดกิจกรรมการตรวจสอบสิทธิ์ของบริการโดยเป็นส่วนหนึ่งของสแต็กของกิจกรรม
คุณไม่จําเป็นต้องอัปเดตแอปเพื่อรองรับการตรวจสอบสิทธิ์ เนื่องจากการตรวจสอบสิทธิ์เกิดขึ้นภายในบริการ อย่างไรก็ตาม คุณต้องตรวจสอบว่าโครงสร้างมุมมองของกิจกรรมได้รับการเก็บรักษาไว้เมื่อกิจกรรมเริ่มทํางานอีกครั้ง เช่น สร้างโครงสร้างมุมมองใน onCreate()
ไม่ใช่ใน onStart()
หรือ onResume()
คุณสามารถยืนยันลักษณะการทำงานของแอปเมื่อบริการป้อนข้อความอัตโนมัติกำหนดให้มีการตรวจสอบสิทธิ์ได้โดยใช้ HeuristicsService จากตัวอย่าง AutofillFramework และกำหนดค่าเพื่อให้มีการตรวจสอบสิทธิ์การตอบกลับการส่ง นอกจากนี้ คุณยังใช้BadViewStructureCreationSignInActivityตัวอย่างเพื่อจําลองปัญหานี้ได้
กําหนดรหัสป้อนข้อความอัตโนมัติให้กับยอดดูที่รีไซเคิล
คอนเทนเนอร์ที่ใช้มุมมองซ้ำ เช่น คลาส RecyclerView
จะมีประโยชน์สําหรับแอปที่ต้องแสดงรายการองค์ประกอบแบบเลื่อนตามชุดข้อมูลขนาดใหญ่ เมื่อคอนเทนเนอร์เลื่อนลง ระบบจะนำมุมมองในเลย์เอาต์มาใช้ซ้ำ แต่มุมมองเหล่านั้นจะมีเนื้อหาใหม่
หากกรอกเนื้อหาเริ่มต้นของมุมมองที่รีไซเคิลแล้ว บริการป้อนข้อความอัตโนมัติจะเก็บความหมายเชิงตรรกะของมุมมองโดยใช้รหัสป้อนข้อความอัตโนมัติ ปัญหาจะเกิดขึ้นเมื่อระบบนํามุมมองในเลย์เอาต์มาใช้ซ้ำ รหัสเชิงตรรกะของมุมมองจะยังคงเหมือนเดิม ทําให้ระบบเชื่อมโยงข้อมูลผู้ใช้ที่ป้อนข้อความอัตโนมัติที่ไม่ถูกต้องกับรหัสการป้อนข้อความอัตโนมัติ
หากต้องการแก้ไขปัญหานี้ในอุปกรณ์ที่ใช้ Android 9 (API ระดับ 28) ขึ้นไป
ให้จัดการรหัสการป้อนข้อความอัตโนมัติของข้อมูลพร็อพเพอร์ตี้ที่ RecyclerView
ใช้อย่างชัดแจ้งโดยใช้วิธีการเหล่านี้
- วิธีการ
getNextAutofillId()
จะรับรหัสการป้อนข้อความอัตโนมัติใหม่ที่ไม่ซ้ำกันสำหรับกิจกรรม - เมธอด
setAutofillId()
จะตั้งค่ารหัสป้อนข้อความอัตโนมัติที่สมเหตุสมผลและไม่ซ้ำกันของมุมมองนี้ในกิจกรรม
จัดการปัญหาที่ทราบ
ส่วนนี้จะแสดงวิธีแก้ปัญหาเบื้องต้นสำหรับปัญหาที่ทราบภายในเฟรมเวิร์กการป้อนข้อความอัตโนมัติ
การป้อนข้อความอัตโนมัติทำให้แอปขัดข้องใน Android 8.0, 8.1
ใน Android 8.0 (API ระดับ 26) และ 8.1 (API ระดับ 27) การป้อนข้อความอัตโนมัติอาจทำให้แอปขัดข้องในบางสถานการณ์ หากต้องการแก้ปัญหาที่อาจเกิดขึ้น ให้ติดแท็กมุมมองที่ไม่ได้ป้อนข้อมูลอัตโนมัติด้วย importantForAutofill=no
นอกจากนี้ คุณยังติดแท็กกิจกรรมทั้งหมดด้วย importantForAutofill=noExcludeDescendants
ได้ด้วย
ระบบจะไม่พิจารณากล่องโต้ตอบที่มีการปรับขนาดสำหรับการป้อนข้อความอัตโนมัติ
ใน Android 8.1 (API ระดับ 27) และต่ำกว่า หากมีการปรับขนาดมุมมองในกล่องโต้ตอบหลังจากที่แสดงแล้ว ระบบจะไม่พิจารณามุมมองดังกล่าวสำหรับการป้อนข้อความอัตโนมัติ มุมมองเหล่านี้จะไม่รวมอยู่ในออบเจ็กต์ AssistStructure
ที่ระบบ Android ส่งไปยังบริการป้อนข้อความอัตโนมัติ ด้วยเหตุนี้ บริการจึงไม่สามารถกรอกข้อมูลในการแสดงผลได้
วิธีแก้ปัญหานี้คือ ให้แทนที่พร็อพเพอร์ตี้ token
ของพารามิเตอร์หน้าต่างโต้ตอบด้วยพร็อพเพอร์ตี้ token
ของกิจกรรมที่สร้างกล่องโต้ตอบ หลังจากตรวจสอบว่าเปิดใช้การป้อนข้อความอัตโนมัติแล้ว ให้บันทึกพารามิเตอร์หน้าต่างในเมธอด onWindowAttributesChanged()
ของคลาสที่รับค่ามาจาก Dialog
จากนั้นแทนที่พร็อพเพอร์ตี้ token
ของพารามิเตอร์ที่บันทึกไว้ด้วยพร็อพเพอร์ตี้ token
ของกิจกรรมระดับบนสุดในเมธอด onAttachedToWindow()
ข้อมูลโค้ดต่อไปนี้แสดงคลาสที่ใช้วิธีแก้ปัญหาเฉพาะหน้า
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(); } }
ข้อมูลโค้ดต่อไปนี้แสดงวิธีตรวจสอบว่าอุปกรณ์รองรับการป้อนข้อความอัตโนมัติและเปิดใช้ฟีเจอร์นี้ให้กับผู้ใช้ปัจจุบันหรือไม่ รวมถึงต้องอาศัยวิธีแก้ปัญหานี้หรือไม่ เพื่อหลีกเลี่ยงการดำเนินการที่ไม่จำเป็น
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(); } }
ทดสอบแอปกับการป้อนข้อความอัตโนมัติ
หลังจากเพิ่มประสิทธิภาพแอปให้ทำงานร่วมกับบริการป้อนข้อความอัตโนมัติแล้ว ให้ทดสอบว่าแอปทำงานได้ตามที่ตั้งใจไว้กับบริการป้อนข้อความอัตโนมัติหรือไม่
ใช้โปรแกรมจำลองหรืออุปกรณ์จริงที่ใช้ Android 8.0 (API ระดับ 26) ขึ้นไปเพื่อทดสอบแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างโปรแกรมจำลองได้ที่หัวข้อสร้างและจัดการอุปกรณ์เสมือน
ติดตั้งบริการป้อนข้อความอัตโนมัติ
คุณต้องติดตั้งแอปอื่นที่ให้บริการป้อนข้อความอัตโนมัติก่อนจึงจะทดสอบแอปด้วยการป้อนข้อความอัตโนมัติได้ คุณสามารถใช้แอปของบุคคลที่สามเพื่อวัตถุประสงค์นี้ แต่การใช้บริการป้อนข้อความอัตโนมัติตัวอย่างจะง่ายกว่าเนื่องจากคุณไม่จําเป็นต้องลงชื่อสมัครใช้บริการของบุคคลที่สาม
คุณสามารถใช้ตัวอย่างเฟรมเวิร์กการป้อนข้อความอัตโนมัติของ Android ใน Java เพื่อทดสอบแอปกับบริการป้อนข้อความอัตโนมัติ แอปตัวอย่างนี้มีบริการป้อนข้อความอัตโนมัติและคลาส Activity
ของไคลเอ็นต์ซึ่งคุณใช้เพื่อทดสอบเวิร์กโฟลว์ก่อนนำไปใช้กับแอปได้ หน้านี้อ้างอิงแอปตัวอย่าง android-AutofillFramework
หลังจากติดตั้งแอปแล้ว ให้เปิดใช้บริการป้อนข้อความอัตโนมัติในการตั้งค่าระบบของโปรแกรมจำลองโดยไปที่การตั้งค่า > ระบบ > ภาษาและการป้อนข้อมูล > ขั้นสูง > ความช่วยเหลือการป้อนข้อมูล > บริการป้อนข้อความอัตโนมัติ
วิเคราะห์ข้อกำหนดด้านข้อมูล
หากต้องการทดสอบแอปด้วยบริการป้อนข้อความอัตโนมัติ บริการดังกล่าวต้องมีข้อมูลที่สามารถใช้กรอกข้อมูลในแอปได้ นอกจากนี้ บริการยังต้องเข้าใจประเภทข้อมูลที่คาดว่าจะปรากฏในมุมมองของแอปด้วย เช่น หากแอปมีมุมมองที่คาดว่าจะมีชื่อผู้ใช้ บริการต้องมีชุดข้อมูลที่มีชื่อผู้ใช้และกลไกบางอย่างเพื่อให้ทราบว่ามุมมองดังกล่าวต้องการข้อมูลดังกล่าว
บอกบริการว่าต้องการข้อมูลประเภทใดในมุมมองโดยการตั้งค่าแอตทริบิวต์ android:autofillHints
บริการบางอย่างใช้วิธีการเดาขั้นสูงเพื่อระบุประเภทข้อมูล แต่บริการอื่นๆ เช่น แอปตัวอย่าง จะต้องอาศัยนักพัฒนาแอปในการให้ข้อมูลนี้ แอปจะทำงานร่วมกับบริการป้อนข้อความอัตโนมัติได้ดีขึ้นหากคุณตั้งค่าแอตทริบิวต์ android:autofillHints
ในมุมมองที่เกี่ยวข้องกับการป้อนข้อความอัตโนมัติ
ทำการทดสอบ
หลังจากวิเคราะห์ข้อกําหนดด้านข้อมูลแล้ว คุณสามารถเรียกใช้การทดสอบ ซึ่งรวมถึงการบันทึกข้อมูลทดสอบในบริการป้อนข้อความอัตโนมัติและเรียกใช้การป้อนข้อความอัตโนมัติในแอป
บันทึกข้อมูลในบริการ
หากต้องการบันทึกข้อมูลในบริการป้อนข้อความอัตโนมัติที่ใช้งานอยู่ ให้ทำดังนี้
- เปิดแอปที่มีข้อมูลพร็อพเพอร์ตี้ซึ่งคาดว่าจะมีประเภทข้อมูลที่คุณต้องการใช้ระหว่างการทดสอบ แอปตัวอย่าง android-AutofillFramework มี UI ที่มีมุมมองที่คาดหวังข้อมูลหลายประเภท เช่น หมายเลขบัตรเครดิตและชื่อผู้ใช้
- แตะมุมมองที่เก็บประเภทข้อมูลที่คุณต้องการ
- ป้อนค่าในมุมมอง
- แตะปุ่มยืนยัน เช่น ลงชื่อเข้าใช้หรือส่ง โดยปกติแล้ว คุณจะต้องส่งแบบฟอร์มก่อนบริการจะบันทึกข้อมูล
- ยืนยันคําขอสิทธิ์จากกล่องโต้ตอบของระบบ กล่องโต้ตอบของระบบจะแสดงชื่อบริการที่ใช้งานอยู่ในปัจจุบันและถามว่าคุณต้องการใช้บริการนี้ในการทดสอบหรือไม่ หากต้องการใช้บริการ ให้แตะบันทึก
หาก Android ไม่แสดงกล่องโต้ตอบสิทธิ์ หรือบริการไม่ใช่บริการที่คุณต้องการใช้ในการทดสอบ ให้ตรวจสอบว่าบริการดังกล่าวทำงานอยู่ในการตั้งค่าระบบหรือไม่
ทริกเกอร์การป้อนข้อความอัตโนมัติในแอป
หากต้องการทริกเกอร์การป้อนข้อความอัตโนมัติในแอป ให้ทําดังนี้
- เปิดแอปและไปที่กิจกรรมที่มียอดดูที่ต้องการทดสอบ
- แตะมุมมองที่ต้องกรอกข้อมูล
- ระบบจะแสดง UI การป้อนข้อความอัตโนมัติซึ่งมีชุดข้อมูลที่จะป้อนลงในมุมมองได้ ดังที่แสดงในรูปที่ 1
- แตะชุดข้อมูลที่มีข้อมูลที่คุณต้องการใช้ มุมมองจะแสดงข้อมูลที่จัดเก็บไว้ในบริการก่อนหน้านี้
หาก Android ไม่แสดง UI การป้อนข้อความอัตโนมัติ ให้ลองใช้ตัวเลือกการแก้ปัญหาต่อไปนี้
- ตรวจสอบว่ามุมมองในแอปใช้ค่าที่ถูกต้องในแอตทริบิวต์
android:autofillHints
ดูรายการค่าที่เป็นไปได้สำหรับแอตทริบิวต์ได้จากค่าคงที่ที่มีคำนำหน้าเป็นAUTOFILL_HINT
ในคลาสView
- ตรวจสอบว่าแอตทริบิวต์
android:importantForAutofill
ได้รับการตั้งค่าเป็นค่าอื่นที่ไม่ใช่no
ในข้อมูลพร็อพเพอร์ตี้ที่ต้องกรอก หรือตั้งเป็นค่าอื่นที่ไม่ใช่noExcludeDescendants
ในข้อมูลพร็อพเพอร์ตี้หรือเป็นค่าระดับบน