1. ก่อนเริ่มต้น
สิ่งที่คุณจะได้สร้าง
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีสร้างแอป Android ด้วย Structured Data Capture Library โดยแอปจะใช้ Structured Data Capture Library เพื่อแสดงผลและประมวลผลแบบสอบถามและการตอบกลับ FHIR
สิ่งที่คุณจะได้เรียนรู้
- วิธีผสานรวม Structured Data Capture Library เข้ากับแอปพลิเคชัน Android
- วิธีแสดงแบบสอบถาม
- วิธีรับคำตอบเป็น
QuestionnaireResponse - วิธีแยกทรัพยากร FHIR จาก
QuestionnaireResponse
สิ่งที่คุณต้องมี
- Android Studio เวอร์ชันล่าสุด (v4.1.2+)
- โปรแกรมจำลองของ Android หรืออุปกรณ์ Android จริง
- โค้ดตัวอย่าง
- ความรู้พื้นฐานเกี่ยวกับการพัฒนาแอป Android ใน Kotlin
Codelab นี้มุ่งเน้นที่ Structured Data Capture Library เราจะข้ามแนวคิดและบล็อกโค้ดที่ไม่เกี่ยวข้องไป และจะให้คุณคัดลอกและวางได้ง่ายๆ หากยังไม่เคยสร้างแอป Android มาก่อน คุณสามารถเริ่มต้นด้วยการสร้างแอปแรก
2. ตั้งค่า
ดาวน์โหลดโค้ด
หากต้องการดาวน์โหลดโค้ดสำหรับ Codelab นี้ ให้โคลนที่เก็บ Android FHIR SDK โดยใช้คำสั่ง git clone https://github.com/ohs-foundation/android-fhir.git
โปรเจ็กต์เริ่มต้นสำหรับ Codelab นี้อยู่ใน codelabs/datacapture
นำเข้าแอปไปยัง Android Studio
มาเริ่มต้นด้วยการนำเข้าแอปเริ่มต้นไปยัง Android Studio
เปิด Android Studio แล้วเลือก Import Project (Gradle, Eclipse ADT, etc.) จากนั้นเลือกโฟลเดอร์ codelabs/datacapture จากซอร์สโค้ดที่คุณดาวน์โหลดไว้ก่อนหน้านี้

เรียกใช้แอปเริ่มต้น
เมื่อนำเข้าโปรเจ็กต์ไปยัง Android Studio แล้ว คุณก็พร้อมที่จะเรียกใช้แอปเป็นครั้งแรก
เชื่อมต่ออุปกรณ์ Android กับโฮสต์ผ่าน USB หรือ เริ่ม Android Studio Emulator, แล้วคลิก Run (
) ในแถบเครื่องมือ Android Studio

อย่างที่คุณเห็นว่าตอนนี้ยังไม่มีอะไรมากนัก ดังนั้นมาเริ่มแสดงแบบสอบถามในแอปกันเลย
3. เพิ่ม Structured Data Capture Library ลงในโปรเจ็กต์
เพิ่มทรัพยากร Dependency สำหรับ Structured Data Capture Library
ทรัพยากร Dependency ของ Structured Data Capture Library ช่วยให้คุณผสานรวม Structured Data Capture Library ในแอปได้ โดยให้เพิ่มบรรทัดต่อไปนี้ที่ส่วนท้ายของไฟล์ app/build.gradle.kts ของโปรเจ็กต์
dependencies {
// ...
implementation("com.google.android.fhir:data-capture:1.2.0")
implementation("androidx.fragment:fragment-ktx:1.6.0")
}
ซิงค์โปรเจ็กต์กับไฟล์ Gradle
คุณควรซิงค์โปรเจ็กต์กับไฟล์ Gradle ในตอนนี้เพื่อให้แน่ใจว่าแอปมีทรัพยากร Dependency ทั้งหมด
เลือก Sync Project with Gradle Files (
) จากแถบเครื่องมือ Android Studio นอกจากนี้ คุณยังเรียกใช้แอปอีกครั้งเพื่อตรวจสอบว่าทรัพยากร Dependency ทำงานอย่างถูกต้อง
4. แสดงแบบสอบถาม
ในขั้นตอนนี้ คุณจะเพิ่มฟังก์ชันการทำงานลงในแอปเริ่มต้นเพื่อแสดงผลแบบสอบถามใน FragmentContainerView
ระหว่างดำเนินการ Android Studio จะแจ้งให้คุณเพิ่มการนำเข้าที่จำเป็น ดังนี้
androidx.core.os.bundleOfandroidx.fragment.app.addandroidx.fragment.app.commitandroid.util.Logcom.google.android.fhir.datacapture.QuestionnaireFragment
ขั้นตอนที่ 1: เพิ่ม FragmentContainerView
เพิ่ม FragmentContainerView ลงในเลย์เอาต์ของแอปพลิเคชัน ซึ่งเป็นตำแหน่งที่จะแสดง QuestionnaireFragment ที่คุณจะสร้างขึ้นในภายหลัง
- เปิด
activity_main.xml(res > layout > activity_main.xml) - ค้นหาตัวเลือกสำหรับมุมมองโค้ด แยก และออกแบบที่ด้านขวาบนของเครื่องมือสร้างเลย์เอาต์
- เลือกมุมมองโค้ด

- คุณไม่จำเป็นต้องใช้
TextViewจึงลบออกได้ อย่าลืมลบทุกอย่างตั้งแต่<TextViewไปจนถึง/>ที่ปิด - เพิ่ม
FragmentContainerViewภายในConstraintLayoutไฟล์activity_main.xmlควรมีลักษณะคล้ายกับไฟล์ต่อไปนี้<?xml version="1.0" encoding="utf-8" ?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <androidx.fragment.app.FragmentContainerView android:id="@+id/fragment_container_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
ขั้นตอนที่ 2: กำหนดค่า QuestionnaireFragment
QuestionnaireFragment ต้องใช้แบบสอบถาม FHIR ที่เข้ารหัส JSON เพื่อแสดงผล เนื่องจากแบบสอบถามมีขนาดเล็ก (<512 KB) คุณจึงจะรวมแบบสอบถามเป็น String ใน Bundle ของอาร์กิวเมนต์ที่จะใช้สร้าง Fragment ส่วนแบบสอบถามขนาดใหญ่ควรระบุเป็น URI เพื่อประสิทธิภาพ
คุณสามารถดูไฟล์ questionnaire.json ได้หากต้องการ แต่ข้อดีอย่างหนึ่งของ Structured Data Capture Library คือคุณไม่จำเป็นต้องทราบโครงสร้างของแบบสอบถาม FHIR (หรือสิ่งใดก็ตามเกี่ยวกับ FHIR) เพื่อให้แสดงผล คุณจะได้ดูไฟล์นี้อย่างละเอียดมากขึ้นในภายหลังของ Codelab
สร้าง QuestionnaireFragment โดยใช้ Builder และตั้งค่าแบบสอบถามโดยใช้ฟังก์ชัน Setter หากต้องการแสดง QuestionnaireFragment ภายในคอนเทนเนอร์เลย์เอาต์ ให้ใช้ FragmentManager เพื่อสร้าง FragmentTransaction
เปิด MainActivity.kt แล้วเพิ่มโค้ดต่อไปนี้ลงในคลาส MainActivity
// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")
val questionnaireFragment =
QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
ขั้นตอนที่ 3: เพิ่ม QuestionnaireFragment ลงใน FragmentContainerView
หากต้องการแสดง QuestionnaireFragment ภายในคอนเทนเนอร์เลย์เอาต์ ให้ใช้ FragmentManager เพื่อสร้าง FragmentTransaction FragmentManager จะจัดการการสร้างอินสแตนซ์โดยใช้ questionnaireParams ที่สร้างไว้ก่อนหน้านี้
เพิ่มโค้ดต่อไปนี้ลงในคลาส MainActivity
// Step 3: Add the QuestionnaireFragment to the FragmentContainerView
if (savedInstanceState == null) {
supportFragmentManager.commit {
setReorderingAllowed(true)
add(R.id.fragment_container_view, questionnaireFragment)
}
}
// Submit button callback
supportFragmentManager.setFragmentResultListener(
QuestionnaireFragment.SUBMIT_REQUEST_KEY,
this,
) { _, _ ->
submitQuestionnaire()
}
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ Fragment
มาเรียกใช้ Codelab โดยคลิก Run (
) ในแถบเครื่องมือ Android Studio คุณควรเห็นข้อมูลที่มีลักษณะคล้ายกับข้อมูลต่อไปนี้

ไปยังส่วนต่างๆ ของแบบสอบถามและลองป้อนคำตอบ ระบบใช้วิดเจ็ตคำตอบที่แตกต่างกัน 2-3 รายการ ซึ่งรวมถึงบูลีน ข้อความ และวันที่ ซึ่งแสดงผลโดยอัตโนมัติตามประเภทพื้นฐานในแบบสอบถาม FHIR ดั้งเดิม
ในทางเทคนิคแล้ว คุณต้องทำเพียงเท่านี้เพื่อแสดงผลแบบสอบถาม ยินดีด้วย
แบบสอบถามจะไม่มีประโยชน์มากนักหากคุณไม่เห็นคำตอบที่ผู้ใช้ป้อน มาไปยังขั้นตอนถัดไปในการรับการตอบกลับแบบสอบถามกันเลย
5. รับการตอบกลับแบบสอบถาม
ในขั้นตอนก่อนหน้านี้ คุณได้แสดงผลแบบสอบถาม FHIR ในแอป
ในส่วนนี้ คุณจะได้รับคำตอบจากแบบสอบถามเป็น QuestionnaireResponse
ค้นหาวิธีการ submitQuestionnaire() แล้วเพิ่มโค้ดต่อไปนี้
// Get a questionnaire response
val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view)
as QuestionnaireFragment
val questionnaireResponse = fragment.getQuestionnaireResponse()
// Print the response to the log
val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser()
val questionnaireResponseString =
jsonParser.encodeResourceToString(questionnaireResponse)
Log.d("response", questionnaireResponseString)
หากต้องการรับการตอบกลับแบบสอบถาม ให้ดึงข้อมูล Fragment แบบสอบถามที่สร้างไว้ก่อนหน้านี้ แล้วใช้วิธีการ getQuestionnaireResponse() ซึ่งจะแสดงผล HAPI FHIR QuestionnaireResponse ที่คุณสามารถใช้ได้โดยตรงหรือใช้ร่วมกับส่วนอื่นๆ ของ Android FHIR SDK Codelab นี้ใช้ไลบรารี HAPI FHIR อื่นๆ เพื่อแปลงเป็นสตริง JSON สำหรับดูในบันทึก
เรียกใช้แอปอีกครั้งเพื่อสร้างใหม่ด้วยการเปลี่ยนแปลงล่าสุด เมื่อแอปทำงานแล้ว ให้ป้อนข้อมูลบางอย่างลงในแบบสอบถาม แล้วแตะส่ง ในบันทึก คุณควรเห็นข้อความที่มี QuestionnaireResponse เป็น JSON
D/response: {"resourceType":"QuestionnaireResponse","item":[{"linkId":"PR","text":"Patient information","item":[{"linkId":"PR-name","text":"Name","item":[{"linkId":"PR-name-given","text":"First Name","answer":[{"valueString":"Dani"}]},{"linkId":"PR-name-family","text":"Family Name","answer":[{"valueString":"Lee"}]}]},{"linkId":"PR-birthdate","text":"Date of Birth","answer":[{"valueDate":"1990-02-14"}]},{"linkId":"PR-id","text":"Identifying information","item":[{"linkId":"PR-name-id-url"},{"linkId":"PR-name-id","text":"Patient Id","answer":[{"valueString":"12345"}]}]}]}]}
6. แยกทรัพยากร FHIR จาก QuestionnaireResponse
แบบสอบถามที่รวมอยู่ในโปรเจ็กต์เริ่มต้นมีไว้สำหรับขั้นตอนการลงทะเบียนผู้ป่วยแบบง่ายๆ ดังนั้นคุณอาจต้องการใช้คำตอบของแบบสอบถามเพื่อสร้างทรัพยากรผู้ป่วย FHIR ตามคำตอบเหล่านั้น การแปลงจากการตอบกลับแบบสอบถามเป็นทรัพยากร FHIR นี้เรียกว่า การดึงข้อมูล เราสามารถทำได้โดยใช้คลาส ResourceMapper ของ Structured Data Capture Library
หากต้องการดึงข้อมูล แบบสอบถามต้องได้รับการเขียนขึ้นเพื่อให้มีข้อมูลเกี่ยวกับวิธีดึงข้อมูล โชคดีที่แบบสอบถามตัวอย่างได้รับการตั้งค่าสำหรับการแยกข้อมูลตามคำจำกัดความแล้ว
ค้นหาวิธีการ submitQuestionnaire() แล้วเพิ่มโค้ดต่อไปนี้
lifecycleScope.launch {
val questionnaire =
jsonParser.parseResource(questionnaireJsonString) as Questionnaire
val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}
ResourceMapper.extract() ต้องใช้แบบสอบถาม HAPI FHIR ซึ่งคุณสร้างได้โดยการแยกวิเคราะห์สตริง JSON ของแบบสอบถามจากก่อนหน้านี้ และ QuestionnaireResponse ซึ่งเราได้รับแล้วก่อนหน้านี้ โดยจะแสดงผล Bundle ธุรกรรม HAPI FHIR ที่มีทรัพยากรที่แยกออกมาอย่างน้อย 1 รายการ ซึ่งในกรณีนี้คือทรัพยากรผู้ป่วยรายการเดียว
เรียกใช้แอปอีกครั้งเพื่อสร้างใหม่ด้วยการเปลี่ยนแปลงล่าสุด เมื่อแอปทำงานแล้ว ให้ป้อนข้อมูลบางอย่าง แล้วแตะส่ง ในบันทึก ตอนนี้คุณควรเห็นข้อความ extraction result ที่มีการแสดง JSON ของ Bundle FHIR ที่แยกออกมา
D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}
7. ยินดีด้วย
คุณได้ใช้ Structured Data Capture Library เพื่อประมวลผลแบบสอบถามและการตอบกลับ FHIR ในแอปแล้ว ดังนี้
- แสดงแบบสอบถาม
- รับการตอบกลับแบบสอบถาม
- แยกทรัพยากร FHIR จาก
QuestionnaireResponse
เพียงเท่านี้คุณก็พร้อมใช้งานแล้ว
เมื่อดำเนินการต่อ คุณอาจต้องการใช้ทรัพยากร FHIR ในรูปแบบอื่นๆ ทั่วทั้งแอปพลิเคชัน ดูไลบรารี FHIR Engine ของ Android FHIR SDK เพื่อเรียนรู้วิธีจัดเก็บและจัดการทรัพยากร FHIR ในแอปพลิเคชันของคุณแบบโลคัล รวมถึงซิงค์ข้อมูลกับเซิร์ฟเวอร์ FHIR ระยะไกล
สิ่งที่เราได้พูดถึงไปแล้ว
- วิธีเพิ่ม Structured Data Capture Library ลงในแอป Android
- วิธีใช้
QuestionnaireFragmentและResourceMapperเพื่อทำงานกับแบบสอบถาม FHIR
ขั้นตอนถัดไป
- สำรวจเอกสารประกอบสำหรับ Structured Data Capture Library
- ปรับแต่งรูปลักษณ์ของแบบสอบถามที่แสดงผล
- ใช้ Structured Data Capture Library ในแอป Android ของคุณเอง