1. Trước khi bắt đầu
Sản phẩm bạn sẽ tạo ra
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách tạo ứng dụng Android bằng Thư viện thu thập dữ liệu có cấu trúc. Ứng dụng của bạn sẽ sử dụng Thư viện thu thập dữ liệu có cấu trúc để kết xuất và xử lý Bảng câu hỏi và câu trả lời FHIR.
Kiến thức bạn sẽ học được
- Cách tích hợp Thư viện thu thập dữ liệu có cấu trúc vào ứng dụng Android của bạn
- Cách hiện Bảng câu hỏi
- Cách nhận câu trả lời với tư cách là
QuestionnaireResponse
- Cách trích xuất tài nguyên FHIR từ
QuestionnaireResponse
Bạn cần có
- Phiên bản Android Studio (v4.1.2 trở lên) mới đây
- Trình mô phỏng Android hoặc thiết bị Android thực
- Mã mẫu
- Kiến thức cơ bản về cách phát triển cho Android bằng Kotlin
Lớp học lập trình này tập trung vào Thư viện thu thập dữ liệu có cấu trúc. Các khái niệm và khối mã không liên quan được che khuất và chỉ được cung cấp cho bạn để sao chép và dán. Nếu chưa từng xây dựng ứng dụng Android, bạn có thể bắt đầu bằng cách tạo ứng dụng đầu tiên.
2. Bắt đầu thiết lập
Tải mã nguồn xuống
Để tải mã này xuống cho lớp học lập trình này, hãy sao chép kho lưu trữ SDK FHIR của Android: git clone https://github.com/google/android-fhir.git
Dự án khởi đầu của lớp học lập trình này nằm ở codelabs/datacapture
.
Nhập ứng dụng vào Android Studio
Hãy bắt đầu bằng cách nhập ứng dụng khởi đầu vào Android Studio.
Mở Android Studio, chọn Import Project (Gradle, Eclipse ADT, v.v.) rồi chọn thư mục codelabs/datacapture
trong mã nguồn mà bạn đã tải xuống trước đó.
Chạy ứng dụng khởi đầu
Giờ đây, sau khi nhập dự án vào Android Studio, bạn có thể chạy ứng dụng của mình lần đầu tiên.
Kết nối thiết bị Android với máy chủ lưu trữ của bạn qua USB hoặc Khởi động trình mô phỏng Android Studio rồi nhấp vào Chạy () trên thanh công cụ Android Studio.
Như bạn có thể thấy chưa có nhiều ứng dụng ở đây, hãy bắt đầu ngay lập tức hiển thị bảng câu hỏi trong ứng dụng của bạn!
3. Thêm Thư viện thu thập dữ liệu có cấu trúc vào dự án
Thêm phần phụ thuộc cho Thư viện thu thập dữ liệu có cấu trúc
Các phần phụ thuộc Thư viện thu thập dữ liệu có cấu trúc cho phép bạn tích hợp Thư viện thu thập dữ liệu có cấu trúc vào ứng dụng của mình. Hãy thêm các dòng sau vào cuối tệp app/build.gradle.kts
của dự án:
dependencies {
// ...
implementation("com.google.android.fhir:data-capture:1.0.0")
implementation("androidx.fragment:fragment-ktx:1.5.5")
}
Đồng bộ hoá dự án với các tệp Gradle
Để đảm bảo tất cả phần phụ thuộc đều dùng được cho ứng dụng, bạn nên đồng bộ hoá dự án với các tệp gradle.
Chọn Sync Project with Gradle Files (Đồng bộ hoá dự án với tệp Gradle) () trên thanh công cụ Android Studio. Bạn cũng sẽ chạy lại ứng dụng để kiểm tra xem các phần phụ thuộc có đang hoạt động đúng cách hay không.
4. Hiện bảng câu hỏi
Ở bước này, bạn sẽ thêm chức năng vào ứng dụng khởi đầu để kết xuất bảng câu hỏi trong FragmentContainerView
.
Đồng thời, Android Studio sẽ nhắc bạn thêm các lệnh nhập cần thiết:
androidx.core.os.bundleOf
androidx.fragment.app.add
androidx.fragment.app.commit
android.util.Log
com.google.android.fhir.datacapture.QuestionnaireFragment
Bước 1: Thêm một FragmentContainerView
Thêm FragmentContainerView
vào bố cục của ứng dụng. Đây là nơi hiển thị QuestionnaireFragment
mà bạn sẽ tạo sau này.
- Mở
activity_main.xml
(res > layout > activity_main.xml). - Tìm các tuỳ chọn cho các khung hiển thị Code (Mã), Split (Phân tách) và Design (Thiết kế) ở phía trên bên phải của Layout Editor (Trình chỉnh sửa bố cục).
- Chọn Chế độ xem mã.
- Bạn không cần đến
TextView
nữa nên có thể xoá thành phần hiển thị này. Hãy nhớ xoá toàn bộ nội dung từ thẻ mở<TextView
đến hết thẻ đóng/>
. - Thêm
FragmentContainerView
bên trongConstraintLayout
. Tệpactivity_main.xml
của bạn sẽ có dạng như sau:<?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>
Bước 2: Thêm QuestionnaireFragment
vào FragmentContainerView
QuestionnaireFragment
yêu cầu phải có Bảng câu hỏi FHIR được mã hoá JSON để kết xuất. Vì bộ câu hỏi có kích thước nhỏ (dưới 512 KB), nên bạn sẽ đưa bảng câu hỏi này vào dưới dạng String
trong Bundle
gồm các đối số dùng để tạo mảnh. Bạn nên cung cấp các bảng câu hỏi lớn hơn dưới dạng URI
để đảm bảo hiệu suất.
Bạn có thể xem tệp questionnaire.json
nếu muốn, nhưng một trong những lợi ích của Thư viện thu thập dữ liệu có cấu trúc là bạn không cần phải biết cấu trúc của Bảng câu hỏi FHIR (hoặc bất kỳ nội dung nào về FHIR) để hiển thị nó! Bạn sẽ tìm hiểu kỹ hơn về tệp này ở phần sau của lớp học lập trình này.
Tạo QuestionnaireFragment
bằng trình tạo và đặt bộ câu hỏi bằng hàm setter. Để hiển thị QuestionnaireFragment
trong vùng chứa bố cục, hãy sử dụng FragmentManager
để tạo FragmentTransaction
.
Mở MainActivity.kt
rồi thêm mã sau vào lớp 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()
)
}
}
Tìm hiểu thêm về cách sử dụng mảnh.
Hãy chạy lớp học lập trình này bằng cách nhấp vào biểu tượng Chạy () trên thanh công cụ Android Studio. Bạn sẽ thấy mã tương tự như sau:
Di chuyển qua bộ câu hỏi và thử nhập một số câu trả lời. Có một vài tiện ích trả lời được sử dụng, bao gồm boolean, văn bản và ngày tháng. Các tiện ích này được hiển thị tự động dựa trên loại cơ bản trong bộ câu hỏi FHIR ban đầu.
Về mặt kỹ thuật, đó là tất cả những gì bạn cần làm để tạo bảng câu hỏi! Xin chúc mừng!
Tuy nhiên, bảng câu hỏi sẽ không giúp ích nhiều nếu bạn không thấy câu trả lời mà người dùng nhập. Hãy chuyển sang bước tiếp theo để nhận được câu trả lời cho bộ câu hỏi!
5. Nhận câu trả lời cho bộ câu hỏi
Ở các bước trước, bạn đã đưa ra một bảng câu hỏi FHIR trong ứng dụng của mình.
Trong phần này, bạn sẽ nhận được câu trả lời của bộ câu hỏi dưới dạng Câu trả lời trong bảng câu hỏi.
Tìm phương thức submitQuestionnaire()
rồi thêm đoạn mã sau:
// 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)
Để nhận câu trả lời cho bộ câu hỏi, hãy truy xuất mảnh bộ câu hỏi đã tạo trước đó rồi sử dụng phương thức getQuestionnaireResponse()
. Thao tác này sẽ trả về một HAPI FHIR QuestionnaireResponse
mà bạn có thể sử dụng trực tiếp hoặc sử dụng với các phần khác của SDK Android FHIR. Lớp học lập trình này sử dụng các thư viện HAPI FHIR khác để chuyển đổi thư viện đó thành một chuỗi JSON để xem trong nhật ký.
Chạy lại ứng dụng để xây dựng lại ứng dụng với những thay đổi mới nhất. Khi bảng câu hỏi chạy, hãy nhập một số thông tin vào bảng câu hỏi rồi nhấn vào Gửi. Trong nhật ký, bạn sẽ thấy một thông báo chứa QuestionnaireResponse
ở dạng 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. Trích xuất Tài nguyên FHIR từ QuestionnaireResponse
Bộ câu hỏi trong dự án khởi đầu là dành cho một quy trình đăng ký đơn giản cho bệnh nhân. Vì vậy, bạn nên sử dụng các câu trả lời trong bộ câu hỏi để xây dựng tài nguyên cho bệnh nhân FHIR dựa trên các câu trả lời đó. Quá trình chuyển đổi từ câu trả lời của bộ câu hỏi thành tài nguyên FHIR được gọi là trích xuất dữ liệu. Chúng ta có thể thực hiện việc này bằng lớp ResourceMapper
của Thư viện thu thập dữ liệu có cấu trúc.
Để trích xuất dữ liệu, bạn phải tạo bộ câu hỏi để thêm thông tin về cách trích xuất dữ liệu. May mắn thay, bộ câu hỏi mẫu đã được thiết lập cho Trích xuất dựa trên định nghĩa.
Tìm phương thức submitQuestionnaire()
rồi thêm đoạn mã sau:
lifecycleScope.launch {
val questionnaire =
jsonParser.parseResource(questionnaireJsonString) as Questionnaire
val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}
ResourceMapper.extract()
yêu cầu bạn phải sử dụng Bộ câu hỏi HAPI FHIR (bạn có thể tạo Bộ câu hỏi này bằng cách phân tích cú pháp chuỗi JSON của bộ câu hỏi trước đó) và một QuestionnaireResponse
mà chúng ta đã có trước đó. Phương thức này trả về một Gói giao dịch HAPI FHIR chứa một hoặc nhiều tài nguyên đã trích xuất – trong trường hợp này là một tài nguyên dành cho Bệnh nhân.
Chạy lại ứng dụng để xây dựng lại ứng dụng với những thay đổi mới nhất. Khi tính năng này chạy, hãy nhập một số thông tin rồi nhấn vào Gửi. Trong nhật ký, giờ đây bạn sẽ thấy một thông báo extraction result
chứa cách biểu diễn JSON của Gói FHIR đã trích xuất.
D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}
7. Xin chúc mừng!
Bạn đã sử dụng Thư viện thu thập dữ liệu có cấu trúc để xử lý bảng câu hỏi và câu trả lời FHIR trong ứng dụng của mình:
- Hiện bảng câu hỏi
- Nhận câu trả lời cho bộ câu hỏi
- Trích xuất tài nguyên FHIR từ
QuestionnaireResponse
Đó là tất cả những gì bạn cần để thiết lập và chạy chiến dịch!
Khi tiếp tục, có thể bạn sẽ muốn làm việc với các tài nguyên FHIR theo nhiều cách hơn trong suốt ứng dụng của mình. Hãy xem Thư viện công cụ FHIR của SDK Android FHIR để tìm hiểu cách lưu trữ và quản lý cục bộ tài nguyên FHIR trong ứng dụng của bạn cũng như đồng bộ hoá dữ liệu với máy chủ FHIR từ xa.
Nội dung đã đề cập
- Cách thêm Thư viện thu thập dữ liệu có cấu trúc vào ứng dụng Android
- Cách sử dụng
QuestionnaireFragment
vàResourceMapper
cho bộ câu hỏi FHIR
Các bước tiếp theo
- Khám phá tài liệu về Thư viện thu thập dữ liệu có cấu trúc
- Tuỳ chỉnh giao diện của bộ câu hỏi được hiển thị
- Áp dụng Thư viện thu thập dữ liệu có cấu trúc trong ứng dụng Android của riêng bạn