1. 事前準備
建構項目
在本程式碼研究室中,您將瞭解如何使用結構化資料擷取程式庫建構 Android 應用程式。應用程式會使用結構化資料擷取程式庫,轉譯及處理 FHIR 問卷和回覆。
課程內容
- 如何將結構化資料擷取程式庫整合至 Android 應用程式
- 如何顯示問卷
- 如何以
QuestionnaireResponse身分取得答案 - 如何從
QuestionnaireResponse擷取 FHIR 資源
軟硬體需求
- 最新版 Android Studio (4.1.2 以上版本)
- Android 模擬器或實體 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.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至/>結尾全部刪除。 - 在
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 包含在 Bundle 的引數中,用於建立片段。String基於效能考量,較大的問卷調查應以 URI 形式提供。
您可以查看 questionnaire.json 檔案,但結構化資料擷取程式庫的優點之一,就是您不需要瞭解 FHIR 問卷的結構 (或任何 FHIR 相關資訊),就能讓問卷呈現出來!您會在程式碼研究室稍後的部分中,更仔細地查看這個檔案。
使用相關建構工具建立 QuestionnaireFragment,並使用設定函式設定問卷。如要在版面配置容器中顯示 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 Patient 資源。將問卷調查回覆轉換為 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,其中包含一或多個擷取的資源 (在本例中為單一 Patient 資源)。
再次執行應用程式,以使用最新變更重建應用程式。執行後,請輸入一些資訊並輕觸「提交」。現在您應該會在記錄中看到訊息 extraction result,其中包含擷取 FHIR Bundle 的 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 應用程式中套用結構化資料擷取資料庫