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
首先,将起始应用导入 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.0.0")
implementation("androidx.fragment:fragment-ktx:1.5.5")
}
将项目与 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 视图选项。
- 选择“代码”视图。
- 您不需要
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
添加到 FragmentContainerView
“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")
if (savedInstanceState == null) {
supportFragmentManager.commit {
setReorderingAllowed(true)
add(
R.id.fragment_container_view,
QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
)
}
}
详细了解如何使用 fragment。
让我们点击 Android Studio 工具栏中的“Run”() 来运行此 Codelab。您应该会看到如下所示的内容:
浏览调查问卷并尝试输入一些答案。系统会使用一些不同的答案微件(包括布尔值、文本和日期),这些微件根据原始 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 的其他部分一起使用。此 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. 从命令行提取 FHIR 资源 QuestionnaireResponse
入门级项目中包含的调查问卷是针对简单的患者注册流程,因此您最终可能需要根据调查问卷回复来创建 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 Engine 库,了解如何在应用本地存储和管理 FHIR 资源,以及如何与远程 FHIR 服务器同步数据。
所学内容
- 如何向 Android 应用添加结构化数据捕获库
- 如何使用
QuestionnaireFragment
和ResourceMapper
处理 FHIR 调查问卷
后续步骤
- 浏览结构化数据捕获库的文档
- 自定义所呈现调查问卷的外观和风格
- 在您自己的 Android 应用中应用结构化数据捕获库