1. Zanim zaczniesz
Co utworzysz
Z tego ćwiczenia dowiesz się, jak utworzyć aplikację na Androida za pomocą biblioteki do przechwytywania danych strukturalnych. Aplikacja będzie używać biblioteki Structured Data Capture Library do renderowania i przetwarzania kwestionariuszy FHIR oraz odpowiedzi.
Czego się nauczysz
- Jak zintegrować bibliotekę przechwytywania danych strukturalnych z aplikacją na Androida
- Jak wyświetlić kwestionariusz
- Jak uzyskać odpowiedzi jako
QuestionnaireResponse - Jak wyodrębnić zasoby FHIR z
QuestionnaireResponse
Czego potrzebujesz
- Najnowsza wersja Android Studio (4.1.2 lub nowsza)
- Android Emulator lub fizyczne urządzenie z Androidem;
- Przykładowy kod
- Podstawowa wiedza na temat tworzenia aplikacji na Androida w języku Kotlin
Te ćwiczenia z programowania skupiają się na bibliotece do przechwytywania danych strukturalnych. Nieistotne koncepcje i bloki kodu zostały pominięte. Można je po prostu skopiować i wkleić. Jeśli nie masz jeszcze doświadczenia w tworzeniu aplikacji na Androida, możesz zacząć od utworzenia pierwszej aplikacji.
2. Konfiguracja
Pobieranie kodu
Aby pobrać kod do tego laboratorium, sklonuj repozytorium Android FHIR SDK: git clone https://github.com/google/android-fhir.git
Projekt początkowy tego ćwiczenia znajduje się w codelabs/datacapture.
Importowanie aplikacji do Android Studio
Zacznijmy od zaimportowania aplikacji startowej do Androida Studio.
Otwórz Android Studio, wybierz Importuj projekt (Gradle, Eclipse ADT itp.) i wybierz folder codelabs/datacapture z pobranego wcześniej kodu źródłowego.

Uruchamianie aplikacji startowej
Po zaimportowaniu projektu do Android Studio możesz po raz pierwszy uruchomić aplikację.
Podłącz urządzenie z Androidem do hosta za pomocą kabla USB lub uruchom emulator Android Studio i na pasku narzędzi Android Studio kliknij Uruchom (
).

Jak widzisz, nie ma tu jeszcze zbyt wiele, więc od razu przejdźmy do wyświetlania kwestionariusza w aplikacji.
3. Dodawanie do projektu biblioteki przechwytywania danych strukturalnych
Dodawanie zależności biblioteki Structured Data Capture Library
Zależności biblioteki przechwytywania danych strukturalnych umożliwiają zintegrowanie jej z aplikacją. Dodaj te wiersze na końcu pliku app/build.gradle.kts w projekcie:
dependencies {
// ...
implementation("com.google.android.fhir:data-capture:1.2.0")
implementation("androidx.fragment:fragment-ktx:1.6.0")
}
Synchronizowanie projektu z plikami Gradle
Aby mieć pewność, że wszystkie zależności są dostępne dla aplikacji, na tym etapie zsynchronizuj projekt z plikami Gradle.
Na pasku narzędzi Android Studio wybierz Synchronizuj projekt z plikami Gradle (
). Możesz też ponownie uruchomić aplikację, aby sprawdzić, czy zależności działają prawidłowo.
4. Wyświetlanie kwestionariusza
W tym kroku dodasz do aplikacji startowej funkcję renderowania kwestionariusza w elemencie FragmentContainerView.
W trakcie tego procesu Android Studio poprosi Cię o dodanie niezbędnych importów:
androidx.core.os.bundleOfandroidx.fragment.app.addandroidx.fragment.app.commitandroid.util.Logcom.google.android.fhir.datacapture.QuestionnaireFragment
Krok 1. Dodaj FragmentContainerView
Dodaj FragmentContainerView do układu aplikacji. W tym miejscu będą wyświetlane QuestionnaireFragment, które utworzysz później.
- Otwórz
activity_main.xml(res > layout > activity_main.xml). - Opcje widoków Kod, Podzielony i Projekt znajdziesz w prawym górnym rogu edytora układu.
- Wybierz widok kodu.

- Nie potrzebujesz znaku
TextView, więc go usuń. Pamiętaj, aby usunąć wszystko od<TextViewdo zamykającego/>. - Dodaj
FragmentContainerViewwConstraintLayout. Plikactivity_main.xmlpowinien wyglądać podobnie do tego:<?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>
Krok 2. Skonfiguruj QuestionnaireFragment
QuestionnaireFragment wymaga do renderowania kwestionariusza FHIR zakodowanego w formacie JSON. Ponieważ kwestionariusz jest mały (ma mniej niż 512 KB), umieścisz go jako String w Bundle argumentów, które zostaną użyte do utworzenia fragmentu. Ze względu na wydajność większe ankiety należy przesyłać w formacie URI.
Jeśli chcesz, możesz przejrzeć plik questionnaire.json, ale jedną z zalet biblioteki przechwytywania danych strukturalnych jest to, że aby wyrenderować kwestionariusz FHIR, nie musisz znać jego struktury ani niczego o FHIR. Przyjrzysz się temu plikowi dokładniej w dalszej części tego modułu.
Utwórz obiekt QuestionnaireFragment za pomocą jego konstruktora i ustaw kwestionariusz za pomocą funkcji ustawiającej. Aby wyświetlić element QuestionnaireFragment w kontenerze układu, użyj elementu FragmentManager, aby utworzyć element FragmentTransaction.
Otwórz MainActivity.kt i dodaj ten kod do klasy MainActivity:
// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")
val questionnaireFragment =
QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
Krok 3. Dodaj element QuestionnaireFragment do elementu FragmentContainerView
Aby wyświetlić element QuestionnaireFragment w kontenerze układu, użyj elementu FragmentManager, aby utworzyć element FragmentTransaction. Funkcja FragmentManager obsługuje tworzenie instancji przy użyciu utworzonego wcześniej elementu questionnaireParams.
Dodaj do klasy MainActivity ten kod:
// 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()
}
Dowiedz się więcej o korzystaniu z fragmentów.
Uruchommy codelab, klikając Uruchom (
) na pasku narzędzi Android Studio. Powinien pojawić się ekran podobny do tego:

Przejdź przez ankietę i spróbuj wpisać odpowiedzi. Użyto kilku różnych widżetów odpowiedzi, w tym wartości logicznych, tekstu i dat, które zostały automatycznie wyrenderowane na podstawie typu w oryginalnym kwestionariuszu FHIR.
Technicznie to wszystko, co musisz zrobić, aby wyrenderować kwestionariusz. Gratulacje!
Kwestionariusz nie jest zbyt przydatny, jeśli nie możesz zobaczyć odpowiedzi wpisanych przez użytkowników. Przejdźmy do następnego kroku, czyli uzyskania odpowiedzi na kwestionariusz.
5. Uzyskiwanie odpowiedzi na pytania
W poprzednich krokach wyrenderowano w aplikacji kwestionariusz FHIR.
W tej sekcji znajdziesz odpowiedzi z kwestionariusza w formie obiektu QuestionnaireResponse.
Znajdź metodę submitQuestionnaire() i dodaj ten kod:
// 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)
Aby uzyskać odpowiedź na ankietę, pobierz utworzony wcześniej fragment ankiety, a następnie użyj metody getQuestionnaireResponse(). Zwraca on obiekt HAPI FHIR QuestionnaireResponse, którego możesz używać bezpośrednio lub z innymi częściami pakietu Android FHIR SDK. W tym samouczku używane są inne biblioteki HAPI FHIR do przekształcania go w ciąg znaków JSON, który można wyświetlić w dzienniku.
Uruchom ponownie aplikację, aby ją przebudować z uwzględnieniem najnowszych zmian. Gdy aplikacja będzie działać, wpisz informacje w kwestionariuszu i kliknij Prześlij. W logu powinien pojawić się komunikat zawierający QuestionnaireResponse w formacie 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. Wyodrębnianie zasobów FHIR z odpowiedzi na ankietę
Kwestionariusz dołączony do projektu początkowego służy do prostego procesu rejestracji pacjenta, więc ostatecznie możesz użyć odpowiedzi na pytania, aby utworzyć na ich podstawie zasób FHIR Patient. Proces przekształcania odpowiedzi na pytania w zasoby FHIR nazywa się wyodrębnianiem danych. Możemy to zrobić za pomocą klasy ResourceMapper biblioteki przechwytywania danych strukturalnych.
Aby przeprowadzić wyodrębnianie danych, musisz utworzyć kwestionariusz, który będzie zawierać informacje o tym, jak przeprowadzić wyodrębnianie danych. Na szczęście przykładowy kwestionariusz jest już skonfigurowany pod kątem wyodrębniania na podstawie definicji.
Znajdź metodę submitQuestionnaire() i dodaj ten kod:
lifecycleScope.launch {
val questionnaire =
jsonParser.parseResource(questionnaireJsonString) as Questionnaire
val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}
ResourceMapper.extract() wymaga kwestionariusza HAPI FHIR, który możesz utworzyć, analizując ciąg znaków JSON kwestionariusza z wcześniejszego etapu, oraz QuestionnaireResponse, który już wcześniej uzyskaliśmy. Zwraca transakcję HAPI FHIR Bundle zawierającą co najmniej 1 wyodrębniony zasób – w tym przypadku 1 zasób Pacjent.
Uruchom ponownie aplikację, aby ją przebudować z uwzględnieniem najnowszych zmian. Po uruchomieniu aplikacji wpisz informacje i kliknij Prześlij. W dzienniku powinien być teraz widoczny komunikat extraction result zawierający reprezentację JSON wyodrębnionego pakietu FHIR.
D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}
7. Gratulacje!
W aplikacji używasz biblioteki Structured Data Capture Library do przetwarzania kwestionariuszy i odpowiedzi FHIR:
- Wyświetlanie kwestionariusza
- Uzyskiwanie odpowiedzi na pytania
- Wyodrębnianie zasobów FHIR z
QuestionnaireResponse
To wszystko, czego potrzebujesz, aby zacząć korzystać z tej funkcji.
W trakcie pracy nad aplikacją możesz chcieć korzystać z zasobów FHIR na więcej sposobów. Zapoznaj się z biblioteką FHIR Engine pakietu Android FHIR SDK, aby dowiedzieć się, jak przechowywać zasoby FHIR i nimi zarządzać lokalnie w aplikacji oraz synchronizować dane ze zdalnym serwerem FHIR.
Omówione zagadnienia
- Dodawanie biblioteki przechwytywania danych strukturalnych do aplikacji na Androida
- Jak używać symboli
QuestionnaireFragmentiResourceMapperdo pracy z kwestionariuszami FHIR
Następne kroki
- Zapoznaj się z dokumentacją biblioteki Structured Data Capture Library
- Dostosowywanie wyglądu i stylu renderowanych kwestionariuszy
- Stosowanie biblioteki Structured Data Capture Library we własnej aplikacji na Androida