Repository navigation
Reference Data Capture
Status: External Open Health Stack design reference. This is background material, not OpenVitals implementation policy.
Completing questionnaires is a core task for most healthcare workers using mobile health apps.
Data entry can be difficult and errors happen. Our goal with the Structured Data Capture (SDC) library and the design guidelines is to empower you to improve the user experience of data entry and the quality of captured data.
The four themes covered in this section are:

The Android FHIR SDK has two layout options for you to choose between:
- Long scroll (default)
- Paginated
A long scroll questionnaire shows all questions on one page and users navigate to each question by scrolling.
A paginated questionnaire displays the content across separate pages. Related questions or input fields can be grouped together on one page. Back and next buttons are anchored at the bottom of the page to navigate between pages.
Learn how to make a questionnaire paginated on GitHub
Each layout option has its advantages and disadvantages. Below are some attributes of each layout type to consider as you're making the choice about which layout to use.
| | Long scroll | Paginated | | Speed of navigation | Faster to navigate | Slower to navigate | | Accuracy of navigation | Less precise navigation | More precise navigation | | Refocus on question after task switching | Difficult to reorient after interruption | Easier to reorient after interruption | | Completing the digital questionnaire after the visit (copying from paper) | Easier when copying from paper | More difficult when copying from paper | | Small screens | Worse for small screens | Better for small screens | | Accessibility | Worse for accessibility. Difficult to navigate. | Better for accessibility. Discrete screens that can be handled by screen readers, text-to-speech, and other technologies. |
| Space for instructions and explanations | Worse for guidance and instructions | Better for guidance and instructions |
|---|






The progress indicator reflects progress made within a questionnaire.
Include a progress indicator on long questionnaires to help users navigate and
see progress. Progress indicators show location within a questionnaire, and
how much is left to complete.


Navigation buttons (back, next) are anchored at the bottom of the questionnaire. In an infinite scroll or on the last page of a paginated questionnaire the next button is labeled Submit.
Keep buttons in a consistent location and always use active buttons that are
labeled with their action, such as back and next.


No
Avoid icon only buttons. Always label buttons with a descriptive action.

- Questionnaire title.
- Progress indicator.
- Group header.
- Question title.
- Instructions.
- Input field.
- Entry format.
- Required fields.
- Help.
Group header is a text header that is displayed above question titles.
Use the group header to group similar questions together. Only use the group
header when it adds helpful information.


The question title succinctly describes what information is requested. Question titles have the largest font size on the page to draw the user's eyes to the question.
Every page or question should have a question title. Keep question titles
short or phrase it as a question.



Instructions is an optional text field shown below the question title.
Use the instructions field to explain relevant instructions such as if the
question is required, how many selections can be made (one or many), and what
users should do if unable to complete all info or answer the question.



Label text informs users about what information is requested for a text field or dropdown. When the field is selected, the label text moves from the middle of the text field to the top.
Every text field and dropdown box should have a label. Label text should
be short, clear, and fully visible.



EntryFormat is shown below the text field to inform users of the specific format data needs to be entered in. Error messages will be displayed in the EntryFormat field and replace existing EntryFormat instructions.
Use EntryFormat for dates, phone numbers, units, and integers.



Required fields indicate that a user must complete the field and is blocked from advancing until the field is completed.
To indicate that a field is required, display an asterisk (*) at the end of the
question title. Include 'required question' in the instructions field as it is
not obvious to everyone what an asterisk (*) indicates. If there's no question
title, display the asterisk (*) in the label text.





A help icon is displayed next to the question title. Upon tapping the icon, a help information box appears with additional information. Tapping the icon again closes the help information box.
This is an optional component. Only use when helpful to display additional
information that does not need to always be visible.



| Type of data entry | Boolean choice | Single choice | Multiple choice | Open choice | Dropdown | Date picker | Text field | Slider | Auto-complete | | Select Yes or No | | | | | | | | | | | Select one option | | | | | | | | | caution | | Select multiple options | | | | | | | | | caution | | Text | | | | | | | | | | | Dates | | | | | | | | | |
| Numbers | caution |
|---|
Text fields indicate that users can enter information.
Use text fields when someone needs to enter text into the questionnaire, such as a name, phone number, or address. Limit data entry that requires text (keyboard) entry when a pre-populated selection (multiple choice or single choice) can be used instead.
Learn more about text fields on
material.io


Single choice and boolean choice are a selection control that appear as radio buttons when users are asked to select one choice from options.
Use boolean choice when there's a binary choice of 'Yes' or 'No.' Otherwise,
use the single choice component. If there's more than ~10 options in the list,
use a dropdown instead of single choice. A dropdown is more dense and easier
to navigate when there are many options.

- primary school 4. secondary school.](https://developers.google.com/static/open-health-stack/design/images/data-capture/singlechoice-single.png) Yes
Use single choice when users can select one option in the list.
No Avoid single choice for very long lists (10+). Use a dropdown instead.
The date picker allows users to enter dates through both the calendar date picker and the keyboard. The calendar date picker is activated when the calendar icon is tapped.
Use the calendar date picker only for dates that are close to today's date such
as last menstrual period or next visit. Otherwise prioritize keyboard entry for
dates like birthdate.


Dropdown menus allow users to make a selection from multiple options. As the user begins typing, options filter based on what's entered. This can help users quickly find the right option from a large list.
Dropdown menus are a great alternative to single choice when the list of
options is very long (10+ options) as they take up less space.


Multiple choice is a selection control that appears as checkboxes when users can make multiple sections from a list of options.
Use multiple choice when users can only select from a predetermined list of
options. If users can also add their own free response, use the open choice
component instead. In the instructions field write "Select all that apply" so
users know they can select multiple options.


Open choice is similar to multiple choice, but adds the ability for a user to select Other and type in free text.
Use open choice when there's a pre-set list of options, but users can also add
additional options. Use open choice when the majority of options are known,
but you foresee some users will select Other because none of the supplied
options apply.


Sliders allow users to make selections from a range of values. The slider in the Android FHIR SDK is a discrete slider. A discrete slider allows users to select a specific value from a predetermined range. Tick marks may be used to indicate available values. Avoid using the slider for numerical data entry. Instead use a text field or a dropdown menu.
Learn more about sliders on
material.io

Data validations constrain the type of data or the values that can be entered in a text field. Data validation can improve the quality of data collected.
Use the EntryFormat field to display format or value restrictions. Show
meaningful data validation error messages in-line and immediately so users can
fix the error.




Error messages alert users when something goes wrong and communicate how to fix the problem.
Use color, iconography and text to communicate errors.
Learn more about error messages on
material.io






No
One icon is often enough. Don't overdo it on the use of icons to communicate the error.
Generated from docs/reference/design/data-capture.md. Edit it there; changes made here are overwritten.
This wiki mirrors the Markdown in Hale-MTU/OpenVitals on every push to main.
Features
- Features
- Achievements
- Activity And Training Plans
- Activity Metrics
- Apple Health Import
- Beverage Logging And Caffeine
- Bluetooth LE Sensors
- Body Energy
- Body Metrics
- CoMaps Navigation Context
- CSV Import
- Cycle Tracking
- Daily Readiness
- Elevation Correction
- Feature Map
- FIT Files Import
- Food Logging
- GPX/KML/KMZ/TCX Route Import
- Health Connect Metrics Dashboard
- Health Report Export
- Heart And Vitals
- Heart Rate Recovery
- Home Screen Widgets
- Hydration
- Manual Entry Of Metrics
- Medical Records
- Metric Detail Customization
- Mindfulness
- Non Health Connect Metrics Dashboard
- Nutrition
- Offline Maps Support
- Onboarding And Permissions
- Preloaded Beverage Nutrition Reference
- Privacy, Support, And Diagnostics
- Recording Of Activity
- Reminders
- Settings And Preferences
- Sleep Score And Recovery
- Sleep Tracking
- Statistics
- Sync With Another Phone
How-to
App
- App Guide
- FAQ
- Getting Started
- Health Connect
- Install
- Local And Connected Editions
- Permissions
- Privacy
- Screenshots
- Support
Reference
- Design Reference
- Reference
- Design Guidelines for Offline & Sync
- OpenVitals UI Notes
- Reference: Data Capture
- Reference: Data Display
- Reference: Health Connect Matchmaking
- Reference: Health Connect Onboarding
- Reference: Health Connect Permissions
- Reference: Health Connect UX
- Reference: Promoting Health Connect
Engineering
- Code Analysis
- Engineering
- Flutter ↔ Kotlin test-parity matrix
- apple-health-import
- Architecture
- body-cycle-recovery
- Design system conformance
- Development
- Feature Playbook
- Flutter -> Kotlin test parity: domain/data/core/contract/state/navigation/di/bootstrap/l10n/widget_test
- Flutter → Kotlin test-parity matrix: features section
- Flutter → Kotlin test-parity matrix: ui / goldens / integration / fixtures
- Flutter-to-Kotlin test-parity matrix — dashboard + devicesync
- manual-entry
- Translations
Proposals
- Proposals
- Activity Start Flow Analysis
- Activity Start Flow Simplification Proposals
- Caffeine Detail And Future Sleep Insights
- Cycle Tracking: Design and Status
- Medical Records Through Health Connect
- Medical Records: What Is Left
Releases
- OpenVitals 2.16.0
- OpenVitals 2.15.2
- OpenVitals 2.15.1
- OpenVitals 2.15.0
- OpenVitals 2.14.5
- OpenVitals 2.14.4
- OpenVitals 2.14.3
- OpenVitals 2.14.2
- OpenVitals 2.14.1
- OpenVitals 2.14.0
- OpenVitals 2.13.0
- OpenVitals 2.12.0
- OpenVitals 2.11.2
- OpenVitals 2.11.1
- OpenVitals 2.11.0
- OpenVitals 2.10.1
- OpenVitals 2.10.0
- OpenVitals 2.9.1
- OpenVitals 2.9.0
- OpenVitals 2.8.0
- OpenVitals 2.7.3
- OpenVitals 2.7.2
- OpenVitals 2.7.1
- OpenVitals 2.7.0
- OpenVitals 2.6.6
- OpenVitals 2.6.5
- OpenVitals 2.6.4
- OpenVitals 2.6.3
- OpenVitals 2.6.2
- OpenVitals 2.6.1
- OpenVitals 2.6.0
- OpenVitals 2.5.0
- OpenVitals 2.4.1
- OpenVitals 2.4.0
- OpenVitals 2.3.2
- OpenVitals 2.3.1
- OpenVitals 2.3.0
- OpenVitals 2.2.8
- OpenVitals 2.2.7
- OpenVitals 2.2.6
- OpenVitals 2.2.5
- OpenVitals 2.2.4
- OpenVitals 2.2.3
- OpenVitals 2.2.2
- OpenVitals 2.2.1
- OpenVitals 2.2.0
- OpenVitals 2.1.0
- OpenVitals 2.0.4
- OpenVitals 2.0.3
- OpenVitals 2.0.2
- OpenVitals 2.0.1
- OpenVitals 1.9.0
- OpenVitals 1.8.0
- OpenVitals 1.7.7
- OpenVitals 1.7.6
- OpenVitals 1.7.5
- OpenVitals 1.7.4
- OpenVitals 1.7.3
- OpenVitals 1.7.2
- OpenVitals 1.7.1
- OpenVitals 1.7.0
- OpenVitals 1.6.3
- OpenVitals 1.6.2
- OpenVitals 1.6.1
- OpenVitals 1.6.0
- OpenVitals 1.5.1
- OpenVitals 1.5.0
Project


No
Avoid single choice for very long lists (10+). Use a dropdown instead.