1. 事前準備
建構項目
在本程式碼研究室中,您將瞭解如何使用結構化資料擷取程式庫建構 Android 應用程式。您的應用程式會使用結構化資料擷取程式庫,轉譯及處理 FHIR 問卷和回應。
課程內容
- 如何將結構化資料擷取程式庫整合至 Android 應用程式
- 如何顯示問卷
- 如何以
QuestionnaireResponse
的身分取得答案 - 如何從
QuestionnaireResponse
中擷取 FHIR 資源
軟硬體需求
- 最新版 Android Studio (4.1.2 以上版本)
- Android Emulator 或實體 Android 裝置
- 程式碼範例
- 對 Kotlin 中的 Android 開發作業有基本瞭解
本程式碼研究室著重於結構化資料擷取程式庫。我們不會對與本主題無關的概念和程式碼多做介紹,但會事先準備好這些程式碼區塊,屆時您只要複製及貼上即可。如果您之前未建構過 Android 應用程式,可以先建構第一個應用程式。
2. 做好準備
下載程式碼
如要下載此程式碼研究室的程式碼,請複製 Android FHIR SDK 存放區:git clone https://github.com/google/android-fhir.git
這個程式碼研究室的範例專案位於 codelabs/datacapture
中。
將應用程式匯入 Android Studio
首先,我們要將範例應用程式匯入 Android Studio。
開啟 Android Studio,選取「Import Project (Gradle, Eclipse ADT, etc.)」,然後從先前下載的來源程式碼中選擇 codelabs/datacapture
資料夾。
執行範例應用程式
專案已匯入 Android Studio,您可以開始執行應用程式。
透過 USB 將 Android 裝置連接至主機,或啟動 Android Studio 模擬器,然後按一下 Android Studio 工具列中的「Run」(執行) ()。
如您所見,這裡還沒有太多內容,因此讓我們直接在應用程式中顯示問卷吧!
3. 將結構化資料擷取程式庫新增至專案
新增結構化資料擷取程式庫的依附元件
結構化資料擷取程式庫依附元件可讓您在應用程式中整合結構化資料擷取程式庫。請在專案的 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 檔案同步。
在 Android Studio 工具列中選取「Sync Project with Gradle Files」 ()。您也可以再次執行應用程式,檢查依附元件是否正常運作。
4. 顯示問卷
在這個步驟中,您將為啟動器應用程式新增功能,以便在 FragmentContainerView
中顯示問卷。
在這個過程中,Android Studio 會提示您新增必要的匯入項目:
androidx.core.os.bundleOf
androidx.fragment.app.add
androidx.fragment.app.commit
android.util.Log
com.google.android.fhir.datacapture.QuestionnaireFragment
步驟 1:新增 FragmentContainerView
將 FragmentContainerView
新增至應用程式的版面配置。這裡會顯示您稍後建立的 QuestionnaireFragment
。
- 開啟
activity_main.xml
(依序點選「res」>「layout」>「activity_main.xml」)。 - 在版面配置編輯器的右上方,找到「Code」、「Split」和「Design」檢視畫面的選項。
- 選取「Code」檢視畫面。
- 您不需要
TextView
,因此請將其刪除。請務必從<TextView
至/>
結尾全部刪除。 - 在
ConstraintLayout
中加入FragmentContainerView
。您的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
需要 JSON 編碼的 FHIR 問卷才能轉譯。由於問卷內容很小 (小於 512 KB),您可以在用來建立片段的引數 Bundle
中,將問卷內容納入 String
。為提升效能,較大型的問卷應以 URI
的形式提供。
您可以查看 questionnaire.json
檔案,但結構化資料擷取程式庫的優點之一,就是您不必瞭解 FHIR 問卷的結構 (或任何有關 FHIR 的內容),就能讓系統轉譯這份問卷!您稍後會在程式碼研究室中更深入地瞭解這個檔案。
使用建構工具建立 QuestionnaireFragment
,然後使用 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()
}
進一步瞭解如何使用片段。
讓我們按一下 Android Studio 工具列中的「Run」(),執行程式碼研究室。畫面應如下所示:
瀏覽問卷並嘗試輸入一些答案。系統會使用幾種不同的答案小工具,包括布林值、文字和日期,這些小工具會根據原始 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)
如要取得問卷回覆,請擷取先前建立的問卷片段,然後使用 getQuestionnaireResponse()
方法。這會傳回 HAPI FHIR QuestionnaireResponse
,您可以直接使用,也可以搭配 Android FHIR SDK 的其他部分使用。本程式講義會使用其他 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. 從 QuestionnaireResponse 擷取 FHIR 資源
在入門專案中,我們提供的問卷調查是為了簡化病患註冊流程,因此您可能會想根據問卷調查的回覆,建立 FHIR 病患資源。從問卷回覆轉換為 FHIR 資源的過程稱為「資料擷取」。我們可以使用結構化資料擷取程式庫的 ResourceMapper
類別來執行這項操作。
如要執行資料擷取作業,您必須在撰寫問卷時,加入執行資料擷取作業的相關資訊。幸好,範例問卷已設定為以定義為依據的擷取。
找出 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
來建立這類問卷。它會傳回 HAPI FHIR 交易 Bundle,其中包含一或多個擷取的資源,在本例中為單一病患資源。
再次執行應用程式,以最新變更內容重新建構應用程式。執行後,請輸入相關資訊,然後輕觸「提交」。您現在應該會在記錄中看到訊息 extraction result
,其中包含擷取的 FHIR 套件 JSON 表示法。
D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}
7. 恭喜!
您已使用結構化資料擷取資料庫,在應用程式中處理 FHIR 問卷和回覆:
- 顯示問卷
- 取得問卷回覆
- 從
QuestionnaireResponse
擷取 FHIR 資源
只要完成這些步驟,就能開始使用了!
在後續步驟中,您可能會想在應用程式中以更多方式使用 FHIR 資源。請參閱 Android FHIR SDK 的 FHIR 引擎程式庫,瞭解如何在應用程式中本機儲存及管理 FHIR 資源,以及如何與遠端 FHIR 伺服器同步處理資料。
涵蓋內容
- 如何在 Android 應用程式中新增結構化資料擷取程式庫
- 如何使用
QuestionnaireFragment
和ResourceMapper
處理 FHIR 問卷
後續步驟
- 查看結構化資料擷取資料庫的說明文件
- 自訂轉譯問卷的外觀和風格
- 在自家 Android 應用程式中套用結構化資料擷取程式庫