1. Zanim zaczniesz
Co utworzysz
Z tego ćwiczenia dowiesz się, jak utworzyć aplikację na Androida za pomocą biblioteki Structured Data Capture Library. Twoja aplikacja będzie używać biblioteki Structured Data Capture Library do renderowania i przetwarzania kwestionariuszy FHIR oraz odpowiedzi.
Czego się nauczysz
- Jak zintegrować bibliotekę Structured Data Capture Library z aplikacją na Androida
- Jak wyświetlić kwestionariusz
- Jak uzyskać odpowiedzi jako
QuestionnaireResponse
- Jak wyodrębnić zasoby FHIR z
QuestionnaireResponse
Czego potrzebujesz
- Nowa wersja Android Studio (4.1.2 lub nowsza)
- emulatora Androida lub fizycznego urządzenia z Androidem,
- Przykładowy kod
- podstawowa znajomość tworzenia aplikacji na Androida w Kotlinie;
To ćwiczenie z programowania koncentruje się na bibliotece do rejestrowania uporządkowanych danych. Nieistotne koncepcje i bloki kodu zostały zamaskowane. Można je po prostu skopiować i wkleić. Jeśli nie tworzysz jeszcze aplikacji na Androida, możesz zacząć od utworzenia pierwszej aplikacji.
2. Konfiguracja
Pobieranie kodu
Aby pobrać kod do tego ćwiczenia, sklonuj repozytorium Android FHIR SDK: git clone https://github.com/google/android-fhir.git
Projekt startowy tego Codelab znajduje się w folderze codelabs/datacapture
.
Zaimportuj aplikację do Android Studio
Zacznijmy od zaimportowania aplikacji startowej do Android Studio.
Otwórz Android Studio, wybierz Importuj projekt (Gradle, Eclipse ADT itp.) i wybierz folder codelabs/datacapture
z poprzednio pobranego kodu źródłowego.
Uruchamianie aplikacji wyjściowej
Po zaimportowaniu projektu do Android Studio możesz uruchomić aplikację po raz pierwszy.
Podłącz urządzenie z Androidem do hosta przez USB lub uruchom emulator Android Studio i kliknij Uruchom () na pasku narzędzi Android Studio.
Jak widzisz, nie ma tu jeszcze zbyt wiele, więc przejdźmy do wyświetlania kwestionariusza w aplikacji.
3. Dodawanie biblioteki do tworzenia uporządkowanych danych do projektu
Dodawanie zależności biblioteki danych strukturalnych
Zależność biblioteki Structured Data Capture Library umożliwia zintegrowanie tej biblioteki w aplikacji. Dodaj te wiersze na końcu pliku app/build.gradle.kts
projektu:
dependencies {
// ...
implementation("com.google.android.fhir:data-capture:1.2.0")
implementation("androidx.fragment:fragment-ktx:1.6.0")
}
Synchronizacja 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 kliknij 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 FragmentContainerView
.
W trakcie instalacji Android Studio poprosi Cię o dodanie niezbędnych plików importowanych:
androidx.core.os.bundleOf
androidx.fragment.app.add
androidx.fragment.app.commit
android.util.Log
com.google.android.fhir.datacapture.QuestionnaireFragment
Krok 1. Dodaj FragmentContainerView
Dodaj FragmentContainerView
do układu aplikacji. Tutaj będą wyświetlane utworzone przez Ciebie później QuestionnaireFragment
.
- Otwórz
activity_main.xml
(res > layout > activity_main.xml). - W prawym górnym rogu Edytora układu znajdziesz opcje widoków Kod, Podział i Projekt.
- Wybierz widok kodu.
- Nie potrzebujesz
TextView
, więc go usuń. Pamiętaj, aby usunąć wszystko od<TextView
do zamykającego/>
. - Dodaj
FragmentContainerView
wewnątrzConstraintLayout
. Plikactivity_main.xml
powinien wyglądać tak:<?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
Do renderowania zapytania QuestionnaireFragment
wymagany jest zakodowany w formacie JSON kwestionariusz FHIR. Ponieważ kwestionariusz jest mały (mniej niż 512 KB), możesz go umieścić jako String
w Bundle
argumentów, które zostaną użyte do utworzenia fragmentu. Ze względu na wydajność większe kwestionariusze należy przesyłać jako URI
.
Jeśli chcesz, możesz przejrzeć plik questionnaire.json
, ale jedną z zalet biblioteki Structured Data Capture Library jest to, że nie musisz znać struktury kwestionariusza FHIR (ani niczego o FHIR), aby go renderować. Więcej informacji o tym pliku znajdziesz w dalszej części tego modułu.
Utwórz obiekt QuestionnaireFragment
za pomocą kreatora i ustaw kwestionariusz za pomocą funkcji settera. Aby wyświetlić QuestionnaireFragment
w kontenerze układu, użyj elementu FragmentManager
do utworzenia elementu FragmentTransaction
.
Otwórz plik MainActivity.kt
i dodaj do klasy MainActivity
ten kod:
// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")
val questionnaireFragment =
QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
Krok 3. Dodaj QuestionnaireFragment do FragmentContainerView
Aby wyświetlić QuestionnaireFragment
w kontenerze układu, użyj elementu FragmentManager
do utworzenia elementu FragmentTransaction
. Funkcja FragmentManager
obsługuje instancjowanie za pomocą utworzonego wcześniej obiektu 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.
Uruchom Codelab, klikając Uruchom () na pasku narzędzi Android Studio. Powinien pojawić się ekran podobny do tego:
Przejdź przez kwestionariusz i spróbuj wpisać kilka odpowiedzi. Używaliśmy kilku różnych widżetów odpowiedzi, w tym typu logicznego, tekstu i daty, które zostały automatycznie wyrenderowane na podstawie typu w pierwotnym kwestionariuszu FHIR.
To wszystko, co musisz zrobić, aby wyrenderować kwestionariusz. Gratulacje!
Ankieta nie jest zbyt przydatna, jeśli nie możesz zobaczyć odpowiedzi użytkowników. Przejdźmy do następnego etapu uzyskiwania odpowiedzi na kwestionariusz.
5. Odpowiedź na kwestionariusz
W poprzednich krokach wyrenderowałaś/wyrenderowałeś w aplikacji kwestionariusz FHIR.
W tej sekcji otrzymasz odpowiedzi z ankiety w postaci 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 kwestionariusz, pobierasz utworzony wcześniej fragment kwestionariusza, a następnie używasz metody getQuestionnaireResponse()
. Zwraca to obiekt HAPI FHIR QuestionnaireResponse
, którego można używać bezpośrednio lub z innymi częściami pakietu Android FHIR SDK. Ten projekt kodu używa innych bibliotek HAPI FHIR do konwertowania danych na ciąg znaków w formacie JSON, aby można je było wyświetlić w rejestrze.
Uruchom aplikację ponownie, aby ją ponownie skompilować z najnowszymi zmianami. Gdy aplikacja się uruchomi, wpisz w kwestionariuszu odpowiednie informacje 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 kwestionariusz
Ankieta zawarta w projekcie startowym służy do prostego procesu rejestracji pacjenta, dlatego warto użyć odpowiedzi na pytania, aby utworzyć na ich podstawie zawartość dla pacjenta w formacie FHIR. Przekształcanie odpowiedzi na pytania w zasoby FHIR nazywa się wyodrębnianiem danych. Możemy to zrobić za pomocą klasy ResourceMapper
z biblioteki Structured Data Capture Library.
Aby umożliwić wyodrębnienie danych, formularz musi zawierać informacje o tym, jak to zrobić. Na szczęście przykładowy kwestionariusz jest już skonfigurowany do 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 wcześniej utworzony ciąg znaków JSON kwestionariusza, oraz QuestionnaireResponse
, który już mamy. Zwraca pakiet transakcji FHIR HAPI zawierający co najmniej jeden wyekstrahowany zasób – w tym przypadku pojedynczy zasób Patient.
Uruchom aplikację ponownie, aby ją ponownie skompilować z najnowszymi zmianami. Gdy aplikacja się uruchomi, wpisz kilka informacji i kliknij Prześlij. W dzienniku powinien teraz pojawić się komunikat extraction result
zawierający reprezentację w formacie 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
- Odpowiedź na kwestionariusz
- Wyodrębnianie zasobów FHIR z poziomu
QuestionnaireResponse
To wszystko, czego potrzebujesz, aby zacząć korzystać z usługi.
W dalszej części tego artykułu omówimy bardziej szczegółowo sposób korzystania z zasobów FHIR w aplikacji. Aby dowiedzieć się, jak przechowywać zasoby FHIR lokalnie w aplikacji i nimi zarządzać oraz jak synchronizować dane z odległym serwerem FHIR, zapoznaj się z biblioteką FHIR Engine w pakiecie Android FHIR SDK.
Omówione zagadnienia
- Dodawanie biblioteki danych strukturalnych do aplikacji na Androida
- Jak używać funkcji
QuestionnaireFragment
iResourceMapper
do pracy z kwestionariuszami FHIR
Następne kroki
- Zapoznaj się z dokumentacją Structured Data Capture Library
- dostosowywanie wyglądu i stylu wygenerowanych kwestionariuszy,
- Stosowanie biblioteki Structured Data Capture Library w aplikacji na Androida