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 một ứng dụng Android bằng Thư viện chụ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 để hiển thị và xử lý các Bảng câu hỏi và câu trả lời theo 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ách hiển thị Bảng câu hỏi
- Cách nhận câu trả lời bằng
QuestionnaireResponse - Cách trích xuất tài nguyên FHIR từ
QuestionnaireResponse
Bạn cần có
- Một phiên bản gần đây của Android Studio (phiên bản 4.1.2 trở lên)
- Trình mô phỏng Android hoặc thiết bị Android thực
- Mã mẫu
- Có kiến thức cơ bản về phát triển Android bằng Kotlin
Lớp học lập trình này tập trung vào Thư viện chụ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 tinh chỉnh và cung cấp cho bạn, chỉ cần sao chép và dán. Nếu chưa từng tạo ứ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ã xuống cho lớp học lập trình này, hãy sao chép kho lưu trữ Android FHIR SDK: git clone https://github.com/google/android-fhir.git
Dự án khởi đầu cho lớp học lập trình này nằm trong 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, etc.) (Nhập dự án (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 đã sẵn sàng chạy ứng dụng lần đầu tiên.
Kết nối thiết bị Android với máy chủ lưu trữ qua USB hoặc Khởi động trình mô phỏng Android Studio rồi nhấp vào Chạy (
) trong thanh công cụ của Android Studio.

Như bạn thấy, hiện tại chưa có nhiều nội dung ở đây, vì vậy, hãy bắt đầu ngay với việc hiển thị một bảng câu hỏi trong ứng dụng của bạn!
3. Thêm Thư viện chụp dữ liệu có cấu trúc vào dự án
Thêm các phần phụ thuộc cho Thư viện Trích xuất dữ liệu có cấu trúc
Các phần phụ thuộc của Thư viện chụp dữ liệu có cấu trúc cho phép bạn tích hợp Thư viện chụp dữ liệu có cấu trúc vào ứng dụng. 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.2.0")
implementation("androidx.fragment:fragment-ktx:1.6.0")
}
Đồng bộ hoá dự án với các tệp Gradle
Để đảm bảo rằng tất cả các phần phụ thuộc đều có sẵn cho ứng dụng của bạn, bạn nên đồng bộ hoá dự án với các tệp gradle tại thời điểm này.
Chọn Sync Project with Gradle Files (Đồng bộ hoá dự án với các tệp Gradle) (
) trên thanh công cụ của Android Studio. Bạn cũng có thể chạy lại ứng dụng để kiểm tra xem các phần phụ thuộc có hoạt động đúng cách hay không.
4. Hiển thị 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 để hiển thị một bảng câu hỏi trong FragmentContainerView.
Trong quá trình này, Android Studio sẽ nhắc bạn thêm các lệnh nhập cần thiết:
androidx.core.os.bundleOfandroidx.fragment.app.addandroidx.fragment.app.commitandroid.util.Logcom.google.android.fhir.datacapture.QuestionnaireFragment
Bước 1: Thêm 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 lựa chọn cho 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.
- Chọn chế độ xem mã.

- Bạn không cần đến
TextViewnữ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
FragmentContainerViewvào bên trongConstraintLayout. Tệpactivity_main.xmlcủ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: Định cấu hình QuestionnaireFragment
QuestionnaireFragment yêu cầu một Bảng câu hỏi FHIR được mã hoá bằng JSON để hiển thị. Vì bảng câu hỏi có kích thước nhỏ (<512 KB), nên bạn sẽ đưa bảng câu hỏi này vào dưới dạng String trong một Bundle gồm các đối số sẽ được dùng để tạo fragment. Bạn nên cung cấp bảng câu hỏi lớn hơn dưới dạng URI vì lý do 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 chụp dữ liệu có cấu trúc là bạn không cần biết cấu trúc của Bộ câu hỏi FHIR (hoặc bất kỳ thông tin nào về FHIR) để hiển thị bộ câu hỏi đó! Bạn sẽ xem xét kỹ hơn tệp này ở phần sau của lớp học lập trình.
Tạo QuestionnaireFragment bằng trình tạo tương ứng và đặt bảng câu hỏi bằng hàm setter. Để hiển thị QuestionnaireFragment trong vùng chứa bố cục, hãy dùng FragmentManager để tạo FragmentTransaction.
Mở MainActivity.kt rồi thêm đoạn mã sau vào lớp MainActivity:
// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")
val questionnaireFragment =
QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
Bước 3: Thêm QuestionnaireFragment vào FragmentContainerView
Để hiển thị QuestionnaireFragment trong vùng chứa bố cục, hãy dùng FragmentManager để tạo FragmentTransaction. FragmentManager xử lý việc tạo thực thể bằng questionnaireParams đã tạo trước đó.
Thêm đoạn mã sau vào lớp 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()
}
Tìm hiểu thêm về cách sử dụng đoạn nội dung.
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 (
) trong thanh công cụ của Android Studio. Bạn sẽ thấy nội dung tương tự như sau:

Chuyển qua bảng câu hỏi và thử nhập một số câu trả lời. Có một số tiện ích trả lời khác nhau được sử dụng, bao gồm cả boolean, văn bản và ngày. Các tiện ích này được tự động hiển thị dựa trên loại cơ bản trong bảng 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 để hiển thị một bảng câu hỏi! Xin chúc mừng!
Bảng câu hỏi sẽ không hữu ích nếu bạn không xem được 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 Phản hồi cho bảng câu hỏi!
5. Nhận phản hồi cho bảng câu hỏi
Trong các bước trước, bạn đã kết xuất 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 từ bảng câu hỏi dưới dạng QuestionnaireResponse.
Tìm phương thức submitQuestionnaire() rồi thêm 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 câu trả lời cho bộ câu hỏi, bạn truy xuất fragment bộ câu hỏi đã tạo trước đó rồi dùng phương thức getQuestionnaireResponse(). Thao tác này trả về một QuestionnaireResponse HAPI FHIR mà bạn có thể sử dụng trực tiếp hoặc với các phần khác của Android FHIR SDK. 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ành chuỗi JSON nhằm xem trong nhật ký.
Chạy lại ứng dụng để tạo lại ứng dụng bằng các thay đổi mới nhất. Sau khi 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ưới 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ảng câu hỏi đi kèm với dự án khởi đầu là dành cho quy trình đăng ký bệnh nhân đơn giản, vì vậy, cuối cùng bạn có thể muốn sử dụng các câu trả lời trong bảng câu hỏi để tạo tài nguyên Bệnh nhân FHIR dựa trên các câu trả lời đó. Quá trình chuyển đổi này từ câu trả lời trong bảng câu hỏi sang 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 chụp dữ liệu có cấu trúc.
Để thực hiện trích xuất dữ liệu, bạn phải soạn bảng câu hỏi để cung cấp thông tin về cách thực hiện việc trích xuất dữ liệu. Thật may là bảng 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 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 một Bảng câu hỏi HAPI FHIR. Bạn có thể tạo bảng này bằng cách phân tích cú pháp chuỗi JSON của bảng câu hỏi từ trước đó và QuestionnaireResponse mà chúng ta đã nhận được trước đó. Thao tác này sẽ trả về một giao dịch HAPI FHIR Bundle chứa một hoặc nhiều tài nguyên được trích xuất – trong trường hợp này là một tài nguyên Bệnh nhân duy nhất.
Chạy lại ứng dụng để tạo lại ứng dụng bằng các thay đổi mới nhất. Sau khi 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 thông báo extraction result chứa nội dung biểu diễn JSON của FHIR Bundle đã 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ý các bảng câu hỏi và câu trả lời FHIR trong ứng dụng của mình:
- Hiển thị bảng câu hỏi
- Nhận phản hồi cho bảng 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 ứng dụng!
Khi tiếp tục, bạn có thể 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ý tài nguyên FHIR cục bộ trong ứng dụng của bạn, đồng thời đồng bộ hoá dữ liệu với một máy chủ FHIR từ xa.
Nội dung đã đề cập
- Cách thêm Thư viện chụp dữ liệu có cấu trúc vào ứng dụng Android
- Cách sử dụng
QuestionnaireFragmentvàResourceMapperđể làm việc với bảng 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ảng câu hỏi được kết xuất
- Á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