Examples
Here are examples of each prompt type supported by ODK Collect and how each is shown to the user. Click on the "Show Snippet" button to reveal the XML snippet that generates the prompt. For full forms, see the sample forms repository.
String

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_string/>
</widgets>
</instance>
<bind nodeset="/widgets/my_string" type="string"/>
<h:body>
<input ref="my_string">
<label>string widget</label>
<hint>can be short or very long</hint>
</input>
</h:body>
Integer

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_int/>
</widgets>
</instance>
<bind nodeset="/widgets/my_int" type="int" constraint=". < 10"
jr:constraintMsg="number must be less than 10"/>
<h:body>
<input ref="my_int">
<label>integer widget</label>
<hint>try entering a number > 10</hint>
</input>
</h:body>
Decimal

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_decimal>18.31</my_decimal>
</widgets>
</instance>
<bind nodeset="/widgets/my_decimal" type="decimal"
constraint=". > 10.51 and . < 18.39"
jr:constraintMsg="number must be between 10.51 and 18.39"/>
<h:body>
<input ref="my_decimal">
<label>decimal widget</label>
<hint>only numbers > 10.51 and < 18.39</hint>
</input>
</h:body>
Date

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_date>2010-06-15</my_date>
</widgets>
</instance>
<bind nodeset="/widgets/my_date" type="date" constraint=". >= today()"
jr:constraintMsg="only future dates allowed"/>
<h:body>
<input ref="my_date">
<label>date widget</label>
<hint>only future dates allowed</hint>
</input>
</h:body>
Time

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_time/>
</widgets>
</instance>
<bind nodeset="/widgets/my_time" type="time"/>
<!-- widget will use am/pm or 24 hour based on the phone's settings. -->
<h:body>
<input ref="my_time">
<label>time widget</label>
<hint>testing time</hint>
</input>
</h:body>
Select multi

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_select>a c</my_select>
</widgets>
</instance>
<bind nodeset="/widgets/my_select" type="select"
constraint="not(selected(., 'c') and selected(., 'd'))"
jr:constraintMsg="option c and d cannot be selected together"/>
<h:body>
<select ref="my_select">
<label>select multiple widget</label>
<hint>don't pick c and d together</hint>
<item>
<label>option a</label>
<value>a</value>
</item>
<item>
<label>option b</label>
<value>b</value>
</item>
<item>
<label>option c</label>
<value>c</value>
</item>
<item>
<label>option d</label>
<value>d</value>
</item>
</select>
</h:body>
Select one

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_select1>8</my_select1>
</widgets>
</instance>
<bind nodeset="/widgets/my_select1" type="select1"/>
<h:body>
<select1 ref="my_select1">
<label>select one widget</label>
<hint>scroll down to see default selection</hint>
<item>
<label>option 1</label>
<value>1</value>
</item>
<item>
<label>option 2</label>
<value>2</value>
</item>
<item>
<label>option 3</label>
<value>3</value>
</item>
<item>
<label>option 4</label>
<value>4</value>
</item>
<item>
<label>option 5</label>
<value>5</value>
</item>
<item>
<label>option 6</label>
<value>6</value>
</item>
<item>
<label>option 7</label>
<value>7</value>
</item>
<item>
<label>option 8</label>
<value>8</value>
</item>
</select1>
</h:body>
Acknowledge

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_trigger/>
</widgets>
</instance>
<bind nodeset="/widgets/my_trigger" />
<h:body>
<trigger ref="my_trigger">
<label>acknowledge widget</label>
<hint>need to push button</hint>
</trigger>
</h:body>
Output

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_output/>
</widgets>
</instance>
<bind nodeset="/widgets/my_output" type="string" readonly="true()"
relevant="selected(/widgets/branch, 'n')"/>
<h:body>
<input ref="my_output">
<label>review widget. is your email
still <output value="/widgets/regex"/>?</label>
<hint>long hint: there is an upcoming section.</hint>
</input>
</h:body>
Location

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_geopoint/>
</widgets>
</instance>
<bind nodeset="/widgets/my_geopoint" type="geopoint"/>
<h:body>
<input ref="my_geopoint">
<label>geopoint widget</label>
<hint>this will get gps location</hint>
</input>
</h:body>
Barcode

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_barcode/>
</widgets>
</instance>
<bind nodeset="/widgets/my_barcode" type="barcode"/>
<h:body>
<input ref="my_barcode">
<label>barcode widget</label>
<hint>scans multi-format 1d/2d barcodes</hint>
</input>
</h:body>
Image capture, select

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_image/>
</widgets>
</instance>
<bind nodeset="/widgets/my_image" type="binary"/>
<h:body>
<upload ref="my_image" mediatype="image/*">
<hint>this will launch the camera</hint>
<label>image widget</label>
</upload>
</h:body>
Audio capture, select

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_audio/>
</widgets>
</instance>
<bind nodeset="/widgets/my_audio" type="binary"/>
<h:body>
<upload ref="my_audio" mediatype="audio/*">
<hint>this will launch the audio recorder</hint>
<label>audio widget</label>
</upload>
</h:body>
Video capture, select

Show Snippet
<instance>
<widgets xmlns="widgets">
<my_video/>
</widgets>
</instance>
<bind nodeset="/widgets/my_video" type="binary"/>
<h:body>
<upload ref="my_video" mediatype="video/*">
<label>video widget</label>
</upload>
</h:body>
String with only numbers

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<numberAsString/>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/numberAsString" type="string"/>
<h:body>
<input ref="/NewWidgets/numberAsString" appearance="numbers">
<label>String field that uses only numbers
(plus a couple extra)</label>
<hint>Takes 0-9, -, +, ., space, and comma</hint>
</input>
</h:body>
Location with map

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<locationMap/>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/locationMap" type="geopoint"/>
<h:body>
<input ref="/NewWidgets/locationMap" appearance="maps">
<label>Geopoint with map Widget</label>
<hint>Note: this uses DATA and requires a connection</hint>
</input>
</h:body>
Date, time

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<dateTime/>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/dateTime" type="dateTime"/>
<!-- widget will use am/pm or 24 hour based on the phone's settings. -->
<h:body>
<input ref="/NewWidgets/dateTime">
<label>Date and Time Widget</label>
</input>
</h:body>
Select one spinner

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<spinner/>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/spinner" type="select1"/>
<h:body>
<select1 appearance="minimal" ref="/NewWidgets/spinner">
<label>Spinner Widget: Select 1</label>
<item>
<label>Choice 1</label>
<value>c1</value>
</item>
<item>
<label>Choice 2</label>
<value>c2</value>
</item>
<item>
<label>Choice 3</label>
<value>c3</value>
</item>
<item>
<label>Choice 4</label>
<value>c4</value>
</item>
</select1>
</h:body>
Select multi spinner

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<spinnermulti/>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/spinnermulti" type="select"/>
<h:body>
<select appearance="minimal" ref="/NewWidgets/spinnermulti">
<label>Spinner Widget: Multi</label>
<item>
<label>Choice 1</label>
<value>c1</value>
</item>
<item>
<label>Choice 2</label>
<value>c2</value>
</item>
<item>
<label>Choice 3</label>
<value>c3</value>
</item>
<item>
<label>Choice 4</label>
<value>c4</value>
</item>
</select>
</h:body>
Select one with auto-advance

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<selectadvance/>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/selectadvance" type="select1"/>
<h:body>
<select1 appearance="quick" ref="/NewWidgets/selectadvance">
<label>Select Widget - Auto Advance</label>
<item>
<label>Choice 1</label>
<value>c1</value>
</item>
<item>
<label>Choice 2</label>
<value>c2</value>
</item>
<item>
<label>Choice 3</label>
<value>c3</value>
</item>
<item>
<label>Choice 4</label>
<value>c4</value>
</item>
</select1>
</h:body>
Select one grid

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<grid/>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/grid" type="select1"/>
<h:body>
<select1 appearance="compact" ref="/NewWidgets/grid">
<label>Grid Widget</label>
<hint>Select an Icon</hint>
<item>
<label ref="jr:itext('sixChoicesc1')"/>
<value>c1</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc2')"/>
<value>c2</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc3')"/>
<value>c3</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc4')"/>
<value>c4</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc5')"/>
<value>c5</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc6')"/>
<value>c6</value>
</item>
</select1>
</h:body>
Select one grid with auto-advance

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<gridauto/>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/grid" type="select1"/>
<h:body>
<select1 appearance="quickcompact" ref="/NewWidgets/gridauto">
<label>Grid Widget - Auto Advance</label>
<hint>Select an Icon</hint>
<item>
<label ref="jr:itext('sixChoicesc1')"/>
<value>c1</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc2')"/>
<value>c2</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc3')"/>
<value>c3</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc4')"/>
<value>c4</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc5')"/>
<value>c5</value>
</item>
<item>
<label ref="jr:itext('sixChoicesc6')"/>
<value>c6</value>
</item>
</select1>
</h:body>
Select one list

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<listGroup>
<q8/>
<q9/>
<q10/>
<q11/>
<q12/>
</listGroup>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/listGroup/q8" type="select1"/>
<bind nodeset="/NewWidgets/listGroup/q9" type="select1"/>
<bind nodeset="/NewWidgets/listGroup/q10" type="select1"/>
<bind nodeset="/NewWidgets/listGroup/q11" type="select1"/>
<bind nodeset="/NewWidgets/listGroup/q12" type="select1"/>
<h:body>
<group appearance="field-list" ref="/NewWidgets/listGroup">
<label>List Group</label>
<select1 appearance="label" ref="/NewWidgets/listGroup/q8">
<label>Labeled Choices</label>
<item>
<label>Yes</label>
<value>yes</value>
</item>
<item>
<label>No</label>
<value>no</value>
</item>
</select1>
<select1 appearance="list-nolabel" ref="/NewWidgets/listGroup/q9">
<label>Q1</label>
<item>
<label>Yes</label>
<value>yes</value>
</item>
<item>
<label>No</label>
<value>no</value>
</item>
</select1>
<select1 appearance="list-nolabel" ref="/NewWidgets/listGroup/q10">
<label>Question 2</label>
<item>
<label>Yes</label>
<value>yes</value>
</item>
<item>
<label>No</label>
<value>no</value>
</item>
</select1>
<select1 appearance="list-nolabel" ref="/NewWidgets/listGroup/q11">
<label>Choice 3</label>
<item>
<label>Yes</label>
<value>yes</value>
</item>
<item>
<label>No</label>
<value>no</value>
</item>
</select1>
<select1 appearance="list-nolabel" ref="/NewWidgets/listGroup/q12">
<label>Option 4</label>
<item>
<label>Yes</label>
<value>yes</value>
</item>
<item>
<label>No</label>
<value>no</value>
</item>
</select1>
</group>
</h:body>
Select multi list

Show Snippet
<instance>
<NewWidgets id="NewWidgets">
<listGroup>
<multiListGroup>
<q13/>
<q14/>
<q15/>
</multiListGroup>
</NewWidgets>
</instance>
<bind nodeset="/NewWidgets/multiListGroup/q13" type="select"/>
<bind nodeset="/NewWidgets/multiListGroup/q14" type="select"/>
<bind nodeset="/NewWidgets/multiListGroup/q15" type="select"/>
<h:body>
<group appearance="field-list" ref="/NewWidgets/multiListGroup">
<label>Multi List Group</label>
<select appearance="label" ref="/NewWidgets/multiListGroup/q13">
<label>Multi Choice List</label>
<item>
<label ref="jr:itext('yesnoYes')"/>
<value>Yes</value>
</item>
<item>
<label ref="jr:itext('yesnoNo')"/>
<value>No</value>
</item>
</select>
<select appearance="list-nolabel" ref="/NewWidgets/multiListGroup/q14">
<label>Brian</label>
<item>
<label ref="jr:itext('yesnoYes')"/>
<value>Yes</value>
</item>
<item>
<label ref="jr:itext('yesnoNo')"/>
<value>No</value>
</item>
</select>
<select appearance="list-nolabel" ref="/NewWidgets/multiListGroup/q15">
<label>Michael</label>
<item>
<label ref="jr:itext('yesnoYes')"/>
<value>Yes</value>
</item>
<item>
<label ref="jr:itext('yesnoNo')"/>
<value>No</value>
</item>
</select>
</group>
</h:body>