1. 准备工作
构建内容
在此 Codelab 中,您将学习如何使用结构化数据捕获库构建 Android 应用。您的应用将使用结构化数据捕获库来呈现和处理 FHIR 调查问卷和回复。
学习内容
- 如何将结构化数据捕获库集成到 Android 应用中
- 如何显示调查问卷
- 如何以
QuestionnaireResponse
的身份获取回答 - 如何从
QuestionnaireResponse
中提取 FHIR 资源
所需条件
- 最新版 Android Studio (v4.1.2+)
- Android 模拟器或一台实体 Android 设备
- 示例代码
- 使用 Kotlin 进行 Android 开发的基础知识
此 Codelab 重点介绍结构化数据捕获库。对于不相关的概念,我们仅会略作介绍,但是会提供相应代码块供您复制和粘贴。如果您之前从未构建过 Android 应用,可以先构建首个应用。
2. 进行设置
下载代码
如需下载此 Codelab 的代码,请克隆 Android FHIR SDK 代码库:git clone https://github.com/google/android-fhir.git
此 Codelab 的起始项目位于 codelabs/datacapture
中。
将应用导入 Android Studio
首先,将 starter 应用导入 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)。 - 在布局编辑器的右上角,找到“代码”“拆分”和“设计”视图选项。
- 选择“代码”视图。
- 您不需要
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),因此您将其作为 String
添加到用于创建 fragment 的参数 Bundle
中。出于性能方面的原因,较大的调查问卷应作为 URI
提供。
您可以根据需要查看 questionnaire.json
文件,但结构化数据捕获库的一个优势是,您无需了解 FHIR 问卷的结构(或 FHIR 的任何信息)即可呈现该问卷!您将在本 Codelab 的后面部分详细了解此文件。
使用构建器创建 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()
}
详细了解如何使用 fragment。
点击 Android Studio 工具栏中的“Run”(运行)图标 () 运行此 Codelab。您应该会看到如下所示的内容:
浏览调查问卷,然后尝试输入一些答案。我们使用了一些不同的答案 widget,包括布尔值、文本和日期,这些 widget 会根据原始 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 字符串,以便在日志中查看。
再次运行应用,使用最新的更改对其进行重新构建。调查问卷开始运行后,请在调查问卷中输入一些信息,然后点按提交。在日志中,您应该会看到一条消息,其中包含 JSON 格式的 QuestionnaireResponse
。
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,其中包含一个或多个提取的资源(在本例中为单个 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. 恭喜!
您已在应用中使用 Structured Data Capture Library 处理 FHIR 调查问卷和回复:
- 显示调查问卷
- 获取调查问卷回复
- 从
QuestionnaireResponse
中提取 FHIR 资源
它现在可以立即运行并使用了!
随着您继续学习,您可能希望在整个应用中以更多方式使用 FHIR 资源。查看 Android FHIR SDK 的 FHIR Engine 库,了解如何在应用中本地存储和管理 FHIR 资源,以及如何与远程 FHIR 服务器同步数据。
所学内容
- 如何将结构化数据捕获库添加到 Android 应用
- 如何使用
QuestionnaireFragment
和ResourceMapper
处理 FHIR 调查问卷
后续步骤
- 探索结构化数据提取库的文档
- 自定义呈现的调查问卷的外观和风格
- 在您自己的 Android 应用中应用 Structured Data Capture Library