1. לפני שמתחילים
מה תפַתחו
ב-codelab הזה תלמדו איך ליצור אפליקציה ל-Android באמצעות ספריית תיעוד הנתונים המובְנים. האפליקציה שלכם תשתמש ב-Structured Data Capture Library כדי להציג ולעבד שאלונים ותשובות ב-FHIR.
מה תלמדו
- איך לשלב את Structured Data Capture Library באפליקציה ל-Android
- איך מציגים שאלון
- איך מקבלים תשובות בתור
QuestionnaireResponse
- איך לחלץ משאבי FHIR מ-
QuestionnaireResponse
מה נדרש
- גרסה עדכנית של Android Studio (מגרסה 4.1.2 ואילך)
- Android Emulator או מכשיר Android פיזי
- הקוד לדוגמה
- ידע בסיסי בפיתוח Android ב-Kotlin
סדנת הקוד הזו מתמקדת ב-Structured Data Capture Library. מושגים וחסימות קוד לא רלוונטיים מוצגים בקצרה, וניתן פשוט להעתיק ולהדביק אותם. אם עדיין לא יצרתם אפליקציות ל-Android, תוכלו להתחיל בפיתוח האפליקציה הראשונה.
2. להגדרה
הורדת הקוד
כדי להוריד את הקוד של סדנת הקוד הזו, צריך לשכפל את המאגר של 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, אפשר להריץ את האפליקציה בפעם הראשונה.
מחברים את מכשיר Android למארח באמצעות USB או מפעילים את אמולטור Android Studio ולוחצים על סמל ההפעלה () בסרגל הכלים של Android Studio.
כפי שאתם רואים, עדיין אין כאן הרבה, אז נתחיל להציג שאלון באפליקציה.
3. הוספת ספריית Structured Data Capture Library לפרויקט
הוספת יחסי התלות של ספריית תיעוד הנתונים המובְנים
יחסי התלות של ספריית תיעוד הנתונים המובְנים מאפשרים לשלב את ספריית תיעוד הנתונים המובְנים באפליקציה. מוסיפים את השורות הבאות לסוף הקובץ app/build.gradle.kts
של הפרויקט:
dependencies {
// ...
implementation("com.google.android.fhir:data-capture:1.2.0")
implementation("androidx.fragment:fragment-ktx:1.6.0")
}
סנכרון הפרויקט עם קובצי Gradle
כדי לוודא שכל יחסי התלות זמינים לאפליקציה, צריך לסנכרן את הפרויקט עם קובצי Gradle בשלב הזה.
בוחרים באפשרות סנכרון הפרויקט עם קובצי Gradle () בסרגל הכלים של Android Studio. אפשר גם להריץ את האפליקציה שוב כדי לבדוק אם יחסי התלות פועלים כמו שצריך.
4. הצגת שאלון
בשלב הזה תוסיפו לאפליקציית ה-starter את הפונקציונליות להצגת שאלון ב-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). - האפשרויות לתצוגות 'קוד', 'חלוקה' ו'עיצוב' נמצאות בפינה השמאלית העליונה של עורך הפריסה.
- בוחרים בתצוגת הקוד.
- אין צורך ב-
TextView
, ולכן מוחקים אותו. חשוב למחוק את כל הטקסט מ-<TextView
ועד לסגירה ב-/>
. - מוסיפים
FragmentContainerView
בתוךConstraintLayout
. קובץ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
כדי להציג את QuestionnaireFragment
, צריך להשתמש בשאלון FHIR מקודד ב-JSON. מכיוון שהשאלון קטן (פחות מ-512KB), צריך לכלול אותו כ-String
ב-Bundle
של ארגומנטים שישמשו ליצירת הקטע. שאלונים ארוכים יותר צריך לספק כ-URI
מסיבות של ביצועים.
אפשר לעיין בקובץ questionnaire.json
אם רוצים, אבל אחד היתרונות של Structured Data Capture Library הוא שאין צורך לדעת מה המבנה של שאלון FHIR (או משהו על FHIR) כדי להציג אותו. בהמשך נבחן את הקובץ הזה לעומק.
יוצרים QuestionnaireFragment
באמצעות ה-builder שלו, ומגדירים את השאלון באמצעות פונקציית ה-setter. כדי להציג את QuestionnaireFragment
בתוך מאגר הפריסה, משתמשים ב-FragmentManager
כדי ליצור FragmentTransaction
.
פותחים את MainActivity.kt
ומוסיפים את הקוד הבא לכיתה MainActivity
:
// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")
val questionnaireFragment =
QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
שלב 3: מוסיפים את QuestionnaireFragment ל-FragmentContainerView
כדי להציג את QuestionnaireFragment
בתוך מאגר הפריסה, משתמשים ב-FragmentManager
כדי ליצור FragmentTransaction
. ה-FragmentManager
מטפל ביצירת המכונה באמצעות ה-questionnaireParams
שנוצר קודם.
מוסיפים את הקוד הבא לכיתה 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()
}
כדי להריץ את הקוד, לוחצים על סמל ההרצה () בסרגל הכלים של Android Studio. התוצאה אמורה להיראות כך:
מנווטים בסקאלה ומנסים להזין כמה תשובות. יש כמה ווידג'טים שונים של תשובות, כולל ערכים בוליאניים, טקסט ותאריכים, שהועברו אוטומטית על סמך הסוג הבסיסי בשאלון המקורי של 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. בקודלאב הזה נעשה שימוש בספריות אחרות של HAPI FHIR כדי להמיר את הנתונים למחרוזת JSON שאפשר להציג ביומן.
מריצים את האפליקציה שוב כדי ליצור אותה מחדש עם השינויים האחרונים. אחרי שהסקר מופעל, מזינים מידע בטופס ומקישים על שליחה. ביומן אמורה להופיע הודעה שמכילה את QuestionnaireResponse
כ-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. חילוץ משאבי FHIR מ-QuestionnaireResponse
השאלון שכלול בפרויקט ההתחלתי מיועד לתהליך פשוט של רישום חולים, לכן יכול להיות שבסופו של דבר תרצו להשתמש בתשובות לשאלון כדי ליצור משאב חולה ב-FHIR על סמך התשובות האלה. ההמרה הזו מתשובה לשאלון למשאבים של FHIR נקראת חילוץ נתונים. אפשר לעשות זאת באמצעות הכיתה ResourceMapper
בספריית Structure Data Capture Library.
כדי לבצע חילוץ נתונים, צריך לכתוב את השאלון כך שיכלול מידע על אופן חילוץ הנתונים. למרבה המזל, שאלון הדוגמה כבר מוגדר לחילוץ שמבוסס על הגדרה.
מחפשים את השיטה 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
, שכבר קיבלנו קודם. הפונקציה מחזירה Bundle של עסקת HAPI FHIR שמכיל משאב אחד או יותר שחולצו – במקרה הזה, משאב Patient יחיד.
מריצים את האפליקציה שוב כדי ליצור אותה מחדש עם השינויים האחרונים. אחרי שהיא פועלת, מזינים פרטים ומקישים על שליחה. ביומן אמורה להופיע עכשיו ההודעה extraction result
שמכילה את הייצוג של ה-JSON של ה-FHIR Bundle שחולץ.
D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}
7. מעולה!
השתמשתם ב-Structured Data Capture Library כדי לעבד שאלונים ותשובות בפורמט FHIR באפליקציה:
- הצגת שאלון
- אחזור של תשובה לשאלון
- חילוץ משאבי FHIR מ-
QuestionnaireResponse
זה כל מה שצריך כדי להפעיל את השירות.
בהמשך, יכול להיות שתרצו לעבוד עם משאבי FHIR בדרכים נוספות ברחבי האפליקציה. כדאי לעיין בספריית FHIR Engine של Android FHIR SDK כדי ללמוד איך לאחסן ולנהל משאבי FHIR באופן מקומי באפליקציה, ואיך לסנכרן נתונים עם שרת FHIR מרוחק.
מה עסקנו בו
- איך מוסיפים את Structured Data Capture Library לאפליקציה ל-Android
- איך משתמשים ב-
QuestionnaireFragment
וב-ResourceMapper
כדי לעבוד עם שאלונים של FHIR
השלבים הבאים
- מסמכי התיעוד של Structured Data Capture Library
- התאמה אישית של המראה והתחושה של שאלונים שעברו עיבוד
- איך משתמשים ב-Structured Data Capture Library באפליקציה ל-Android