{"id":2938256,"date":"2025-09-09T16:08:52","date_gmt":"2025-09-09T23:08:52","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2938256"},"modified":"2025-09-16T16:30:57","modified_gmt":"2025-09-16T23:30:57","slug":"feature-forms-in-arcgis-maps-sdk-for-kotlin","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin","title":{"rendered":"Feature forms in ArcGIS Maps SDK for Kotlin"},"author":395376,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23851,738191],"tags":[22951,774592,769742,317872],"industry":[],"product":[36571,768902,36551,36601],"class_list":["post-2938256","blog","type-blog","status-publish","format-standard","hentry","category-data-management","category-developers","tag-arcgis-content","tag-feature-forms","tag-field-maps-designer","tag-smart-forms","product-arcgis-enterprise","product-sdk-kotlin","product-arcgis-online","product-developers"],"acf":{"authors":[{"ID":395376,"user_firstname":"Mark","user_lastname":"Dugger","nickname":"Mark Dugger","user_nicename":"mdugger","display_name":"Mark Dugger","user_email":"MDugger@esri.com","user_url":"","user_registered":"2025-08-25 17:37:17","user_description":"","user_avatar":"<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/67e81e3a8fe510c468de0483f768bf7051859967f0b42452e46caff91bc3ce26?s=96&#038;d=blank&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/67e81e3a8fe510c468de0483f768bf7051859967f0b42452e46caff91bc3ce26?s=192&#038;d=blank&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' loading='lazy' decoding='async'\/>"}],"related_articles":[{"ID":1520172,"post_author":"10102","post_date":"2023-05-09 10:15:37","post_date_gmt":"2023-05-09 17:15:37","post_content":"","post_title":"Build forms with ArcGIS Field Maps","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"build-forms-in-arcgis-field-maps","to_ping":"","pinged":"","post_modified":"2023-05-09 11:42:11","post_modified_gmt":"2023-05-09 18:42:11","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=1520172","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2930951,"post_author":"320122","post_date":"2025-08-27 09:33:46","post_date_gmt":"2025-08-27 16:33:46","post_content":"","post_title":"Comprehensive Guide to Forms in ArcGIS Online","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"uplevel-editing-forms","to_ping":"","pinged":"","post_modified":"2025-10-30 16:39:01","post_modified_gmt":"2025-10-30 23:39:01","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2930951","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":1777232,"post_author":"320832","post_date":"2024-01-03 08:00:03","post_date_gmt":"2024-01-03 16:00:03","post_content":"","post_title":"Forms aren\u2019t just for ArcGIS Field Maps anymore","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"closed","post_password":"","post_name":"smart-forms-arent-just-for-field-maps-anymore","to_ping":"","pinged":"","post_modified":"2025-05-22 10:32:12","post_modified_gmt":"2025-05-22 17:32:12","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=1777232","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"4","filter":"raw"}],"short_description":"Feature forms in an Android app created with Maps SDK for Kotlin. Code snippets. Create feature form definition with Field Maps Designer.","flexible_content":[{"acf_fc_layout":"content","content":"<p>Apps you create with ArcGIS Maps SDKs for Native Apps can allow users to edit data. In the past, you might have created a <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.popup\/-popup\/index.html\">Popup<\/a> that contains some editable fields. This approach works, but it requires a good deal of coding on your part.<\/p>\n<p>The modern way to create an editable form is to use <em>feature forms<\/em>, which are also known as <em>smart forms<\/em> in other ArcGIS products. Feature forms are both powerful and easy to include in your app. This blog applies generally to Kotlin Maps SDK, Swift Maps SDK, and .NET Maps SDK, but the code snippets use Kotlin for demonstration purposes.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Trees for All<\/h2>\n<p>In this blog, you are the head of a volunteer group named <em>Trees For All<\/em> that will be performing a health-check survey of historically- and botanically-significant trees designated as Heritage Trees by your city. The city has published on its ArcGIS Hub a feature service showing the heritage trees as point features. Your volunteers will visit the trees and provide updated information. To meet this data collection need, you decide to create an Android app in Kotlin that uses a feature form for collecting tree updates.<\/p>\n<p>The city&#8217;s feature service for the heritage trees does not allow public data collection, so you download the city&#8217;s data as a shapefile and use it to create an editable feature layer in your ArcGIS Online organization. You then create a web map, add the editable feature layer to it, and include a feature form to aid your volunteers in their work.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Feature form<\/h2>\n<p>The feature form provides a familiar UI for your volunteers to edit feature attributes, without you needing to create your own UI from scratch. Some of the key features of the feature forms include:<\/p>\n<ul>\n<li>Pre-defined UI elements: Feature forms can have a variety of field elements, such as editable text and number fields, radio buttons, combo boxes (dropdowns), switches (toggles), and attachments such as photos or documents.<\/li>\n<li>Automatic data binding: The feature forms automatically bind to the feature layer&#8217;s attributes, making it easy to display and edit attribute values without having to write custom code.<\/li>\n<li>Validation and error handling: The feature forms include built-in real-time validation and easy-to-code error handling, ensuring that user input is valid and providing feedback when errors occur.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<p>This blog contains three main sections:<\/p>\n<ul>\n<li><a href=\"#tour_of_a_mobile_app_feature_form\">Tour of a mobile app feature form<\/a><\/li>\n<li><a href=\"#use_a_feature_in_your_app\">Use a feature form in your app<\/a><\/li>\n<li><a href=\"#feature_form_definition\">Feature form definition<\/a><\/li>\n<\/ul>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Left","spotlight_image":false},{"acf_fc_layout":"content","content":"<h2 id=\"tour_of_a_mobile_feature_form\">Tour of a mobile feature form<\/h2>\n<p>Let&#8217;s take a brief tour of a feature form suitable for your <em>Trees for All<\/em> app. The form&#8217;s layout, color scheme, and typography are consistent with UI elements on a mobile device. The feature form displays, typically in a bottom sheet, when the user taps a feature on the map.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2939288,"id":2939288,"title":"FeatureFormFirstDisplay6","filename":"FeatureFormFirstDisplay6.png","filesize":152653,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformfirstdisplay6","alt":"","author":"395376","description":"","caption":"","name":"featureformfirstdisplay6","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 02:09:13","modified":"2025-09-10 02:09:13","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":351,"height":528,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6.png","medium-width":174,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6.png","medium_large-width":351,"medium_large-height":528,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6.png","large-width":351,"large-height":528,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6.png","1536x1536-width":351,"1536x1536-height":528,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6.png","2048x2048-width":351,"2048x2048-height":528,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6-309x465.png","card_image-width":309,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6.png","wide_image-width":351,"wide_image-height":528}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormFirstDisplay6.png"},{"acf_fc_layout":"content","content":"<h3>Text box, combo box, text element, and text area<\/h3>\n<p>To see the full form and interact with the field elements, the user swipes up. In the image below, the first five fields are visible.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2939294,"id":2939294,"title":"FeatureFormTopFields4","filename":"FeatureFormTopFields4.png","filesize":69140,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformtopfields4","alt":"First five elements of the feature form.","author":"395376","description":"","caption":"Topmost form elements in the feature form. ","name":"featureformtopfields4","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 02:19:21","modified":"2025-09-10 02:20:41","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":351,"height":553,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4.png","medium-width":166,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4.png","medium_large-width":351,"medium_large-height":553,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4.png","large-width":351,"large-height":553,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4.png","1536x1536-width":351,"1536x1536-height":553,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4.png","2048x2048-width":351,"2048x2048-height":553,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4-295x465.png","card_image-width":295,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4.png","wide_image-width":351,"wide_image-height":553}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormTopFields4.png"},{"acf_fc_layout":"content","content":"<p>Let&#8217;s take a closer look at the elements of the feature form shown above, noting that a border identifies a field as editable and an asterisk identifies a field as required.<\/p>\n<ul>\n<li><strong>Street address<\/strong>: An editable text box, which is a single-line text input field for short answers, such as names or addresses.<\/li>\n<li><strong>Neighborhood<\/strong>: A dropdown list that allows users to select from a predefined set of options. When the user taps on the <strong>Neighborhood<\/strong> field, the Neighborhood list appears, occupying the entire vertical space if the list is long, as it is here.<\/li>\n<\/ul>\n"},{"acf_fc_layout":"image","image":{"ID":2939342,"id":2939342,"title":"FeatureFormNeighborhood4","filename":"FeatureFormNeighborhood4.png","filesize":51556,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformneighborhood4","alt":"Neighborhood combo box","author":"395376","description":"","caption":"Tapping a combo box displays the list","name":"featureformneighborhood4","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 07:12:16","modified":"2025-09-10 07:13:40","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":348,"height":617,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4.png","medium-width":147,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4.png","medium_large-width":348,"medium_large-height":617,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4.png","large-width":348,"large-height":617,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4.png","1536x1536-width":348,"1536x1536-height":617,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4.png","2048x2048-width":348,"2048x2048-height":617,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4-262x465.png","card_image-width":262,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4.png","wide_image-width":348,"wide_image-height":617}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormNeighborhood4.png"},{"acf_fc_layout":"content","content":"<ul>\n<li><strong>Tree id #<\/strong>: A read-only text box that displays information but does not allow user input.<\/li>\n<li><strong>Record your assessment&#8230;<\/strong>: A read-only text element that provides instructions or context for the user, introducing the two editable text area fields that follow. The<\/li>\n<li><strong>Volunteer&#8217;s assessment<\/strong>: A required text area, which is a multi-line text input field for longer answers, such as descriptions or comments.<\/li>\n<\/ul>\n"},{"acf_fc_layout":"content","content":"<h3>Date time picker, radio buttons, group element, and combo box<\/h3>\n<p>If you swipe up further, you can see other types of form elements.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2939313,"id":2939313,"title":"FeatureFormScrollDownOnceFields5","filename":"FeatureFormScrollDownOnceFields5.png","filesize":49145,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformscrolldownoncefields5","alt":"Additional form elements","author":"395376","description":"","caption":"Swipe up to see additional form elements","name":"featureformscrolldownoncefields5","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 05:53:34","modified":"2025-09-10 05:54:01","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":382,"height":589,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5.png","medium-width":169,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5.png","medium_large-width":382,"medium_large-height":589,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5.png","large-width":382,"large-height":589,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5.png","1536x1536-width":382,"1536x1536-height":589,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5.png","2048x2048-width":382,"2048x2048-height":589,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5-302x465.png","card_image-width":302,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5.png","wide_image-width":382,"wide_image-height":589}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormScrollDownOnceFields5.png"},{"acf_fc_layout":"content","content":"<ul>\n<li><strong>Date of volunteer assessment<\/strong>: A date and time picker that allows users to select a date and time for their visit. When the user taps the field, a date and time picker appears.<\/li>\n<\/ul>\n"},{"acf_fc_layout":"image","image":{"ID":2939320,"id":2939320,"title":"FeatureFormDateTimePicker2- Copy","filename":"FeatureFormDateTimePicker2-Copy.png","filesize":56052,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformdatetimepicker2-copy","alt":"Date and time picker","author":"395376","description":"","caption":"Tapping a date element displays the Date and Time picker","name":"featureformdatetimepicker2-copy","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 06:02:06","modified":"2025-09-10 06:02:44","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":363,"height":643,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy.png","medium-width":147,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy.png","medium_large-width":363,"medium_large-height":643,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy.png","large-width":363,"large-height":643,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy.png","1536x1536-width":363,"1536x1536-height":643,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy.png","2048x2048-width":363,"2048x2048-height":643,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy-263x465.png","card_image-width":263,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy.png","wide_image-width":363,"wide_image-height":643}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDateTimePicker2-Copy.png"},{"acf_fc_layout":"content","content":"<ul>\n<li><strong>Status<\/strong>: Radio buttons that allows users to select the official recognition status of the tree: Heritage, Removed, or Merit.<\/li>\n<li><strong>Tree statistics<\/strong>: A collapsed group element that contains multiple related fields, including the tree&#8217;s height, spread, and circumference. The group element can be expanded by tapping the chevron icon to the right of the title.<\/li>\n<\/ul>\n"},{"acf_fc_layout":"image","image":{"ID":2939323,"id":2939323,"title":"FeatureFormGroupExpanded2","filename":"FeatureFormGroupExpanded2.png","filesize":46432,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformgroupexpanded2","alt":"Group element expanded","author":"395376","description":"","caption":"Tapping a collapsed group element expands the group","name":"featureformgroupexpanded2","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 06:06:31","modified":"2025-09-10 06:07:05","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":363,"height":575,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2.png","medium-width":165,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2.png","medium_large-width":363,"medium_large-height":575,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2.png","large-width":363,"large-height":575,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2.png","1536x1536-width":363,"1536x1536-height":575,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2.png","2048x2048-width":363,"2048x2048-height":575,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2-294x465.png","card_image-width":294,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2.png","wide_image-width":363,"wide_image-height":575}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormGroupExpanded2.png"},{"acf_fc_layout":"content","content":"<h3>Real-time form input validation<\/h3>\n<p>Another feature that comes with feature forms from the toolkit is real-time input validation. If the user enters a value that violates the validation rules, an error message immediately appears next to the field. For example, in the dataset schema, the <strong>Street address<\/strong> field is defined with a maximum length of 31 characters. When the user taps in the field, the constraint &#8220;Maximum 31 characters&#8221; automatically appears below the field.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2939326,"id":2939326,"title":"FeatureFormMax31Chars3","filename":"FeatureFormMax31Chars3.png","filesize":91416,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformmax31chars3","alt":"String field with cursor in it. Field constraint displays","author":"395376","description":"","caption":"Tapping a form element displays the field's constraints","name":"featureformmax31chars3","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 06:11:48","modified":"2025-09-10 06:12:38","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":363,"height":643,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3.png","medium-width":147,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3.png","medium_large-width":363,"medium_large-height":643,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3.png","large-width":363,"large-height":643,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3.png","1536x1536-width":363,"1536x1536-height":643,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3.png","2048x2048-width":363,"2048x2048-height":643,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3-263x465.png","card_image-width":263,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3.png","wide_image-width":363,"wide_image-height":643}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31Chars3.png"},{"acf_fc_layout":"content","content":"<p>If the user proceeds to enter more than 31 characters, the field border and the violated constraint turn red\/orange.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2939328,"id":2939328,"title":"FeatureFormMax31ExceededRed2","filename":"FeatureFormMax31ExceededRed2.png","filesize":85790,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformmax31exceededred2","alt":"String element with constraint violation displayed in red","author":"395376","description":"","caption":"Exceeding the element's max length displays border and constraint in red","name":"featureformmax31exceededred2","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 06:26:22","modified":"2025-09-10 06:32:50","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":363,"height":643,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2.png","medium-width":147,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2.png","medium_large-width":363,"medium_large-height":643,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2.png","large-width":363,"large-height":643,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2.png","1536x1536-width":363,"1536x1536-height":643,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2.png","2048x2048-width":363,"2048x2048-height":643,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2-263x465.png","card_image-width":263,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2.png","wide_image-width":363,"wide_image-height":643}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormMax31ExceededRed2.png"},{"acf_fc_layout":"content","content":"<h3>Built-in dialog for validation errors<\/h3>\n<p>When the user taps in a form element, a top bar with a <strong>Save<\/strong> and a <strong>Discard<\/strong> button automatically displays at the top of the form.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2939345,"id":2939345,"title":"FeatureFormDefaultSaveDiscardButtons2","filename":"FeatureFormDefaultSaveDiscardButtons2.png","filesize":90010,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformdefaultsavediscardbuttons2","alt":"Default Save and Discard buttons at top of feature form.","author":"395376","description":"","caption":"Editing in a form element displays default Save and Discard buttons","name":"featureformdefaultsavediscardbuttons2","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 07:41:20","modified":"2025-09-10 07:42:37","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":348,"height":617,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2.png","medium-width":147,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2.png","medium_large-width":348,"medium_large-height":617,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2.png","large-width":348,"large-height":617,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2.png","1536x1536-width":348,"1536x1536-height":617,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2.png","2048x2048-width":348,"2048x2048-height":617,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2-262x465.png","card_image-width":262,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2.png","wide_image-width":348,"wide_image-height":617}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormDefaultSaveDiscardButtons2.png"},{"acf_fc_layout":"content","content":"<p>If there are any errors when the user taps <strong>Save<\/strong>, the following default validation error dialog displays:<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2939348,"id":2939348,"title":"FeatureFormValidationErrorsDefaultDialog3","filename":"FeatureFormValidationErrorsDefaultDialog3.png","filesize":106681,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/featureformvalidationerrorsdefaultdialog3","alt":"The default Validation Errors dialog","author":"395376","description":"","caption":"Tapping Save when there are errors displays the default Validation Errors dialog","name":"featureformvalidationerrorsdefaultdialog3","status":"inherit","uploaded_to":2938256,"date":"2025-09-10 07:46:14","modified":"2025-09-10 07:47:00","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":348,"height":617,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3.png","medium-width":147,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3.png","medium_large-width":348,"medium_large-height":617,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3.png","large-width":348,"large-height":617,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3.png","1536x1536-width":348,"1536x1536-height":617,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3.png","2048x2048-width":348,"2048x2048-height":617,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3-262x465.png","card_image-width":262,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3.png","wide_image-width":348,"wide_image-height":617}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormValidationErrorsDefaultDialog3.png"},{"acf_fc_layout":"content","content":"<p>If there are no errors when the user taps <strong>Save<\/strong>, the edits will be saved to the local storage on the device.<\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"content","content":"<h2 id=\"use_a_feature_in_your_app\">Use a feature form in your app<\/h2>\n"},{"acf_fc_layout":"sidebar","content":"<p>Including a feature form in your app requires some straightforward code. The following sections explain the process.<\/p>\n<ol>\n<li><a href=\"#create_a_feature_form\">Create a feature form<\/a><\/li>\n<li><a href=\"#display_the_feature_form\">Display the feature form<\/a><\/li>\n<li><a href=\"#discard_or_save_edits\">Discard or save edits<\/a><\/li>\n<\/ol>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<h3 id=\"create_a_feature_form\">1 &#8211; Create a feature form<\/h3>\n<p>To create a feature form, you simply need a feature:<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>\r\n<span style=\"color: #d73a49\">import<\/span> com.arcgismaps.mapping.featureforms.FeatureForm\r\n\r\n<span style=\"color: #d73a49\">val<\/span> featureForm = FeatureForm(feature)\r\n\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>The feature can be from any layer that implements the FeatureFormSource, which includes:<\/p>\n<ul>\n<li><a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.layers\/-feature-layer\/index.html\">FeatureLayer<\/a><\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.layers\/-subtype-sublayer\/index.html\">SubtypeSubLayer<\/a><\/li>\n<\/ul>\n<p>If the feature is from a layer, the feature form will automatically use the layer&#8217;s feature form definition. If no feature form definition has been provided for the layer, the feature form will use a default form that includes all editable fields.<\/p>\n<p>For instructions on how to create your own feature form definition, see <a href=\"#feature_form_definition\">Feature form definition<\/a> below.<\/p>\n"},{"acf_fc_layout":"content","content":"<h3 id=\"display_the_feature_form\">2 &#8211; Display the feature form<\/h3>\n<p>To display the feature form, you must make the <code>FeatureForm<\/code> instance available to your app&#8217;s UI. The <a href=\"https:\/\/github.com\/Esri\/arcgis-maps-sdk-kotlin-toolkit\">ArcGIS Maps SDK for Kotlin Toolkit<\/a> provides composables suitable for your Compose-enabled Android apps. The toolkit includes a <code>FeatureForm()<\/code> composable that you use to display the feature form you created. This stateless composable requires a <code>FeatureFormState<\/code> instance, which you create by passing in the <code>FeatureForm<\/code> instance and a coroutine scope. Then you can call <code>FeatureForm()<\/code>, passing in the <code>FeatureFormState<\/code> instance.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>\r\n<span style=\"color: #d73a49\">import<\/span> com.arcgismaps.toolkit.featureforms.FeatureForm\r\n<span style=\"color: #d73a49\">import<\/span> com.arcgismaps.toolkit.featureforms.FeatureFormState\r\n\r\n FeatureForm(\r\n     featureFormState = FeatureFormState(featureForm, scope),\r\n     modifier = Modifier.fillMaxSize().padding(top = <span style=\"color: #005cc5\">20.<\/span>dp)\r\n)\r\n\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p><strong>\u26a0<\/strong><strong>\ufe0f Important note: <\/strong>In the Kotlin Maps SDK, there is a distinction between the <code><a href=\"https:\/\/developers.arcgis.com\/kotlin\/toolkit-api-reference\/arcgis-maps-kotlin-toolkit\/com.arcgismaps.toolkit.featureforms\/-feature-form.html\">FeatureForm()<\/a><\/code> composable, which is part of the toolkit, and the <code><a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.featureforms\/-feature-form\/index.html\">FeatureForm<\/a><\/code> class, which is part of the ArcGIS Maps SDK for Kotlin. The <code>FeatureForm<\/code> class represents the form itself, while the <code>FeatureForm()<\/code> composable is used to display the form in your app&#8217;s UI.\u00a0In your actual app, of course, you will need to call <code>FeatureForm()<\/code> from an appropriate UI composable such as a bottom sheet.<\/p>\n"},{"acf_fc_layout":"content","content":"<h3 id=\"discard_or_save_edits\">3 &#8211; Discard or save edits<\/h3>\n<p>When a user is finished with the current editing sessions, they can either discard the edits or save them. Starting with release 200.8, the ArcGIS Maps SDK for Kotlin toolkit includes a default action bar that has <strong>Save<\/strong> and <strong>Discard<\/strong> buttons.<\/p>\n<p>To provide behavior when the user taps these buttons, pass a lambda to the <code>onEditingEvent<\/code> parameter of the <code>FeatureForm<\/code> composable. The lambda tests which event has been received and handles each appropriately, taking actions like hiding the sheet state, hiding the bottom sheet itself, and clearing the selection of the current feature on the map.<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code>\r\nFeatureForm(\r\n    featureFormState = FeatureFormState(featureForm, scope),\r\n    modifier = Modifier.fillMaxSize().padding(top = <span style=\"color: #005cc5\">20.<\/span>dp),\r\n    onEditingEvent = { featureFormEditingEvent -&gt;\r\n        <span style=\"color: #d73a49\">when<\/span> (featureFormEditingEvent) {\r\n            <span style=\"color: #d73a49\">is<\/span> FeatureFormEditingEvent.SavedEdits -&gt; {\r\n                applyEditsToFeatureService()\r\n                scope.launch {\r\n                    sheetState.hide()\r\n                    showBottomSheet = <span style=\"color: #005cc5\">false<\/span>\r\n                    <span style=\"color: #d73a49\">val<\/span> featureForm = featureFormEditingEvent.featureForm\r\n                    (featureForm.feature.featureTable?.layer <span style=\"color: #d73a49\">as<\/span> FeatureLayer)\r\n                        .clearSelection()\r\n                }\r\n            }\r\n            <span style=\"color: #d73a49\">is<\/span> FeatureFormEditingEvent.DiscardedEdits -&gt; {\r\n                scope.launch {\r\n                    sheetState.hide()\r\n                    showBottomSheet = <span style=\"color: #005cc5\">false<\/span>\r\n                    <span style=\"color: #d73a49\">val<\/span> featureForm = featureFormEditingEvent.featureForm\r\n                    (featureForm.feature.featureTable?.layer <span style=\"color: #d73a49\">as<\/span> FeatureLayer)\r\n                        .clearSelection()\r\n                }\r\n            }\r\n        }\r\n    }\r\n)\r\n\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>Tapping the <strong>Discard<\/strong> button causes the edits to be discarded.<\/p>\n<p>Tapping the <strong>Save<\/strong> button can result in two actions:<\/p>\n<ul>\n<li>If there are errors on the feature form, the default validation errors dialog appears. The edits are not saved to local storage on the device.<\/li>\n<li>If the are no errors on the feature form, the <code>FeatureFormEditingEvent.SavedEdits<\/code> code is executed, which usually persists the edits from the local storage to a feature service.<\/li>\n<\/ul>\n"},{"acf_fc_layout":"content","content":"<h4><strong>Save to feature service<\/strong><\/h4>\n<p>In the <code>onEditingEvent<\/code>callback, the <code>FeatureFormEditingEvent.SavedEdits<\/code> case requires additional code to persist the feature\u2019s edits. In the code example above, note the custom function <code>applyEditsToFeatureService()<\/code>. You might create this function and code it as follows:<\/p>\n<ul>\n<li>Call <code>featureForm.finishEditing()<\/code>, which saves edits of the current feature to the local store.<\/li>\n<li>Get the service feature table from the form\u2019s current feature. Then get the service geodatabase from the feature table.<\/li>\n<li>Apply the edits from local storage to the feature service associated with the <em>Trees_For_All<\/em> layer.<\/li>\n<\/ul>\n"},{"acf_fc_layout":"content","content":"<pre><code style=\"color: #24292e;background: #ffffff;padding: 1em\">\r\n<span style=\"color: #d73a49\">fun<\/span> <span style=\"color: #6f42c1\">applyEditsToFeatureService<\/span>() {\r\n    <span style=\"color: #d73a49\">val<\/span> serviceFeatureTable = featureForm.feature.featureTable <span style=\"color: #d73a49\">as<\/span>? ServiceFeatureTable\r\n        ?: <span style=\"color: #d73a49\">return<\/span> showMessage(<span style=\"color: #032f62\">\"Cannot save feature edit without a ServiceFeatureTable\"<\/span>)\r\n    coroutineScope.launch {\r\n        <span style=\"color: #6a737d\">\/\/ Commits changes of the edited feature to the database.<\/span>\r\n        featureForm.finishEditing().onSuccess {\r\n            serviceFeatureTable.serviceGeodatabase?.let { database -&gt;\r\n                <span style=\"color: #d73a49\">if<\/span> (database.serviceInfo?.canUseServiceGeodatabaseApplyEdits == <span style=\"color: #005cc5\">true<\/span>) {\r\n                    <span style=\"color: #6a737d\">\/\/ Applies all local edits in the tables to the service.<\/span>\r\n                    database.applyEdits().onFailure {\r\n                        <span style=\"color: #d73a49\">return<\/span><span style=\"color: #e36209\">@launch<\/span> showMessage(it.message.toString())\r\n                    }\r\n                } <span style=\"color: #d73a49\">else<\/span> {\r\n                    <span style=\"color: #6a737d\">\/\/ Uploads any changes to the local table to the feature service.<\/span>\r\n                    serviceFeatureTable.applyEdits().onFailure {\r\n                        <span style=\"color: #d73a49\">return<\/span><span style=\"color: #e36209\">@launch<\/span> showMessage(it.message.toString())\r\n                    }\r\n                }\r\n            }\r\n            <span style=\"color: #6a737d\">\/\/ Resets the attributes and geometry to the values in the data source.<\/span>\r\n            featureForm.feature.refresh()\r\n        }.onFailure {\r\n            <span style=\"color: #d73a49\">return<\/span><span style=\"color: #e36209\">@launch<\/span> showMessage(it.message.toString())\r\n        }\r\n    }\r\n}\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<h2 id=\"feature_form_definition\">Feature form definition<\/h2>\n<p>So far, we have learned that the feature form in an Android app is formatted and styled to harmonize with standard Android UI elements. Then we saw some code to integrate the feature form into your app. But where does the actual structure and behavior of the form come from?<\/p>\n<p>The answer is the <em>feature form definition<\/em>\u2014a JSON object that specifies the structure and behavior of a feature form. It defines the fields that will be displayed in the form, the input type for each field (a single-line text string, a multi-line text area, combo box, etc.), constraints on input values (such as max\/min values or coded value domains), and expressions that are evaluated as the user interacts with fields.<\/p>\n<details>\n<summary><span style=\"color: purple;font-style: bold\">\u2295 JSON for feature form definition in a web map &#8230;<\/span><\/summary>\n<div>\n<pre><code>{\r\n    <span style=\"color: #005cc5\">\"operationalLayers\"<\/span>: [\r\n        {\r\n            <span style=\"color: #005cc5\">\"id\"<\/span>: <span style=\"color: #032f62\">\"1991776ee8c-layer-2\"<\/span>,\r\n            <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"Trees_For_All\"<\/span>,\r\n            <span style=\"color: #005cc5\">\"url\"<\/span>: <span style=\"color: #032f62\">\"https:\/\/services2.arcgis.com\/ZQgQTuoyBrtmoGdP\/arcgis\/rest\/services\/Trees_For_All\/FeatureServer\/0\"<\/span>,\r\n            <span style=\"color: #005cc5\">\"itemId\"<\/span>: <span style=\"color: #032f62\">\"5dff911ee35a455aa5e44fcdfaa027d2\"<\/span>,\r\n            <span style=\"color: #005cc5\">\"layerType\"<\/span>: <span style=\"color: #032f62\">\"ArcGISFeatureLayer\"<\/span>,\r\n            <span style=\"color: #005cc5\">\"formInfo\"<\/span>: {\r\n                <span style=\"color: #005cc5\">\"formElements\"<\/span>: [\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Neighborhood\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"Neighborho\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"combo-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"showNoValueOption\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">false<\/span><\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Street address\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"SITE_ADDRE\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"maxLength\"<\/span>: <span style=\"color: #005cc5\">31<\/span>,\r\n                            <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Tree ID #\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/false\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"TREEID\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"text\"<\/span>: <span style=\"color: #032f62\">\"Record your assessment, if any, of the site in **Volunteer's assessment**. For example: branches blocking sidewalk, signs of fungus or infestation, decline in vigor associated with advanced age.\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"textFormat\"<\/span>: <span style=\"color: #032f62\">\"markdown\"<\/span>\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Volunteer's assessment \"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"Volunteer_Assessment\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"maxLength\"<\/span>: <span style=\"color: #005cc5\">1000<\/span>,\r\n                            <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Date of volunteer assessment\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"Date_Volunteer_Assessment\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"datetime-picker\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"includeTime\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">true<\/span><\/span>\r\n                        },\r\n                        <span style=\"color: #005cc5\">\"requiredExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\"<\/span>\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Status\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"STATUS\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"radio-buttons\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"showNoValueOption\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">false<\/span><\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Tree statistics\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"group\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"formElements\"<\/span>: [\r\n                            {\r\n                                <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Height\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"HEIGHT\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                                    <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                                    <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                                }\r\n                            },\r\n                            {\r\n                                <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Date height measured\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"Date_Heigh\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                                    <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"datetime-picker\"<\/span>,\r\n                                    <span style=\"color: #005cc5\">\"includeTime\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">true<\/span><\/span>\r\n                                }\r\n                            },\r\n                            {\r\n                                <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Spread\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"SPREAD\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                                    <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                                    <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                                }\r\n                            },\r\n                            {\r\n                                <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Date spread measured\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"Date_Sprea\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                                    <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"datetime-picker\"<\/span>,\r\n                                    <span style=\"color: #005cc5\">\"includeTime\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">true<\/span><\/span>\r\n                                }\r\n                            },\r\n                            {\r\n                                <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Circumference\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"CIRCUMF\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                                    <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                                    <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                                }\r\n                            },\r\n                            {\r\n                                <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Date circumference measured\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"Date_Circu\"<\/span>,\r\n                                <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                                    <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"datetime-picker\"<\/span>,\r\n                                    <span style=\"color: #005cc5\">\"includeTime\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">true<\/span><\/span>\r\n                                }\r\n                            }\r\n                        ],\r\n                        <span style=\"color: #005cc5\">\"initialState\"<\/span>: <span style=\"color: #032f62\">\"expanded\"<\/span>\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Plaque condition\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"Plaque_not\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"hint\"<\/span>: <span style=\"color: #032f62\">\"The current condition of the Heritage Tree plaque\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"maxLength\"<\/span>: <span style=\"color: #005cc5\">84<\/span>,\r\n                            <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"Date plaque condition noted\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"Plaque_adj\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"datetime-picker\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"includeTime\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">true<\/span><\/span>\r\n                        }\r\n                    }\r\n                ],\r\n                <span style=\"color: #005cc5\">\"expressionInfos\"<\/span>: [\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"expression\"<\/span>: <span style=\"color: #032f62\">\"false\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"name\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/false\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"returnType\"<\/span>: <span style=\"color: #032f62\">\"boolean\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"False\"<\/span>\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"expression\"<\/span>: <span style=\"color: #032f62\">\"true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"name\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"returnType\"<\/span>: <span style=\"color: #032f62\">\"boolean\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"True\"<\/span>\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"expression\"<\/span>: <span style=\"color: #032f62\">\"!IsEmpty($feature[\\\"Volunteer_Assessment\\\"])\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"name\"<\/span>: <span style=\"color: #032f62\">\"expr\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"returnType\"<\/span>: <span style=\"color: #032f62\">\"boolean\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"RequiredIfVolunteerAssessmentMade\"<\/span>\r\n                    }\r\n                ],\r\n                <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"Trees_For_All\"<\/span>\r\n            }\r\n        }\r\n    ],\r\n    <span style=\"color: #005cc5\">\"baseMap\"<\/span>: {\r\n        <span style=\"color: #005cc5\">\"baseMapLayers\"<\/span>: [\r\n            {\r\n                <span style=\"color: #005cc5\">\"id\"<\/span>: <span style=\"color: #032f62\">\"World_Hillshade_3805\"<\/span>,\r\n                <span style=\"color: #005cc5\">\"opacity\"<\/span>: <span style=\"color: #005cc5\">1<\/span>,\r\n                <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"World Hillshade\"<\/span>,\r\n                <span style=\"color: #005cc5\">\"url\"<\/span>: <span style=\"color: #032f62\">\"https:\/\/services.arcgisonline.com\/arcgis\/rest\/services\/Elevation\/World_Hillshade\/MapServer\"<\/span>,\r\n                <span style=\"color: #005cc5\">\"visibility\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">true<\/span><\/span>,\r\n                <span style=\"color: #005cc5\">\"layerType\"<\/span>: <span style=\"color: #032f62\">\"ArcGISTiledMapServiceLayer\"<\/span>\r\n            },\r\n            {\r\n                <span style=\"color: #005cc5\">\"id\"<\/span>: <span style=\"color: #032f62\">\"195012aeb31-layer-2\"<\/span>,\r\n                <span style=\"color: #005cc5\">\"opacity\"<\/span>: <span style=\"color: #005cc5\">1<\/span>,\r\n                <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"World Topographic Map\"<\/span>,\r\n                <span style=\"color: #005cc5\">\"visibility\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">true<\/span><\/span>,\r\n                <span style=\"color: #005cc5\">\"layerType\"<\/span>: <span style=\"color: #032f62\">\"VectorTileLayer\"<\/span>,\r\n                <span style=\"color: #005cc5\">\"styleUrl\"<\/span>: <span style=\"color: #032f62\">\"https:\/\/cdn.arcgis.com\/sharing\/rest\/content\/items\/27e89eb03c1e4341a1d75e597f0291e6\/resources\/styles\/root.json\"<\/span>\r\n            }\r\n        ],\r\n        <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"Topographic\"<\/span>\r\n    },\r\n    <span style=\"color: #005cc5\">\"applicationProperties\"<\/span>: {\r\n        <span style=\"color: #005cc5\">\"offline\"<\/span>: {\r\n            <span style=\"color: #005cc5\">\"syncDataOptions\"<\/span>: <span style=\"color: #005cc5\">8204<\/span>\r\n        }\r\n    },\r\n    <span style=\"color: #005cc5\">\"authoringApp\"<\/span>: <span style=\"color: #032f62\">\"ArcGIS Field Maps Designer\"<\/span>,\r\n    <span style=\"color: #005cc5\">\"authoringAppVersion\"<\/span>: <span style=\"color: #032f62\">\"25.2.2+3a58332\"<\/span>,\r\n    <span style=\"color: #005cc5\">\"initialState\"<\/span>: {\r\n        <span style=\"color: #005cc5\">\"viewpoint\"<\/span>: {\r\n            <span style=\"color: #005cc5\">\"targetGeometry\"<\/span>: {\r\n                <span style=\"color: #005cc5\">\"spatialReference\"<\/span>: {\r\n                    <span style=\"color: #005cc5\">\"latestWkid\"<\/span>: <span style=\"color: #005cc5\">3857<\/span>,\r\n                    <span style=\"color: #005cc5\">\"wkid\"<\/span>: <span style=\"color: #005cc5\">102100<\/span>\r\n                },\r\n                <span style=\"color: #005cc5\">\"xmin\"<\/span>: <span style=\"color: #005cc5\">-13670503.85703468<\/span>,\r\n                <span style=\"color: #005cc5\">\"ymin\"<\/span>: <span style=\"color: #005cc5\">5685535.233677609<\/span>,\r\n                <span style=\"color: #005cc5\">\"xmax\"<\/span>: <span style=\"color: #005cc5\">-13631941.376264859<\/span>,\r\n                <span style=\"color: #005cc5\">\"ymax\"<\/span>: <span style=\"color: #005cc5\">5723218.688622151<\/span>\r\n            }\r\n        }\r\n    },\r\n    <span style=\"color: #005cc5\">\"spatialReference\"<\/span>: {\r\n        <span style=\"color: #005cc5\">\"latestWkid\"<\/span>: <span style=\"color: #005cc5\">3857<\/span>,\r\n        <span style=\"color: #005cc5\">\"wkid\"<\/span>: <span style=\"color: #005cc5\">102100<\/span>\r\n    },\r\n    <span style=\"color: #005cc5\">\"timeZone\"<\/span>: <span style=\"color: #032f62\">\"system\"<\/span>,\r\n    <span style=\"color: #005cc5\">\"version\"<\/span>: <span style=\"color: #032f62\">\"2.34\"<\/span>\r\n}\r\n<\/code><\/pre>\n<\/div>\n<\/details>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"content","content":"<h4><strong>An existing feature form definition<\/strong><\/h4>\n<p>If you are using a feature layer designed by someone else, such as a data specialist, then that person might have already defined a feature form definition in a web map that contains the layer. To use the feature form, you simply follow the instructions in <a href=\"#use_a_feature_in_your_app\">Using a feature form in your app<\/a>.<\/p>\n<h4><strong>No feature form definition<\/strong><\/h4>\n<p>In the event that the web map has <em>no<\/em> feature form definition, your code will still display a feature form\u2014one showing all the fields in the feature layer schema. For datasets with a simple schema, that might be of some use to you. Fields will have visibility and editability properties as set in ArcGIS Pro or on the <strong>Data<\/strong> tab of a feature layer\u2019s items page in ArcGIS Online or ArcGIS Enterprise.<\/p>\n<h4><strong>New feature form definition<\/strong><\/h4>\n<p>In the case of the <em>Trees for All<\/em> feature layer you created, however, the dataset contains dozens of fields. You will want to create your own feature form definition to ensure your form is small enough to be practical for your volunteers to use. The quickest \u00a0way to create a feature form definition is to use The Field Maps Designer, which you can access from ArcGIS Online or ArcGIS Enterprise.<\/p>\n<p>The online web map used in your Trees For All app has the following item page in ArcGIS Online. You should click the <strong>Open in Field Maps Designer<\/strong> button.<\/p>\n<p><strong>\u26a0<\/strong><strong>\ufe0f Important note: <\/strong>You will see that button only if you own the feature layer. You cannot access the Field Maps Designer for data you do not own.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2939218,"id":2939218,"title":"AGOLItemsOpenInFieldMapsDesigner2","filename":"AGOLItemsOpenInFieldMapsDesigner2.png","filesize":161423,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\/agolitemsopeninfieldmapsdesigner2","alt":"Web map Item page in ArcGIS Online with Open in Field Maps Designer button.","author":"395376","description":"","caption":"The item page of your web map displays an Open in Field Maps Designer button","name":"agolitemsopeninfieldmapsdesigner2","status":"inherit","uploaded_to":2938256,"date":"2025-09-09 21:22:21","modified":"2025-09-09 22:58:40","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":936,"height":704,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2.png","medium-width":347,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2.png","medium_large-width":768,"medium_large-height":578,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2.png","large-width":936,"large-height":704,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2.png","1536x1536-width":936,"1536x1536-height":704,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2.png","2048x2048-width":936,"2048x2048-height":704,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2-618x465.png","card_image-width":618,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/AGOLItemsOpenInFieldMapsDesigner2.png","wide_image-width":936,"wide_image-height":704}},"image_position":"left-center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>To define a feature form, you specify the form elements that you want to include in the form. These elements correspond to the attributes of the feature layer that you want to edit.<\/p>\n"},{"acf_fc_layout":"kaltura","video_id":"1_lwm6as21","time":false,"start":0,"stop":""},{"acf_fc_layout":"content","content":"<h3>Evaluate expressions<\/h3>\n<p>Expressions are automatically evaluated when the user interacts with the form. This means that as the user fills out the form, any expressions defined in the form will be re-evaluated, allowing for dynamic updates to the form&#8217;s data.<\/p>\n<p>For example, if you have a field that calculates the total price based on the quantity and unit price fields, the total price will be updated automatically as the user changes the quantity or unit price.<\/p>\n<p>In the <em>Trees for All<\/em> app, for example, you might decide that the <strong>Volunteer\u2019s assessment<\/strong> and <strong>Date of volunteer assessment<\/strong> should not be required elements. But you also decide that if the volunteer enters a <strong>Volunteer\u2019s assessment<\/strong>, they must enter the <strong>\u00a0Date of volunteer assessment<\/strong> as well.\u00a0 To add this behavior, you can create an Arcade expression for <strong>Date of volunteer assessment<\/strong>.<\/p>\n<ol>\n<li>Click the gear icon next to the <strong>Required<\/strong> check box.<\/li>\n<li>In the <strong>Calculated expressions<\/strong> popup, click <strong>+ New expression<\/strong>.<\/li>\n<li>In the New expression dialog, name the expression and input the following Arcade expression:<\/li>\n<\/ol>\n<p><code>!IsEmpty($feature.Volunteer_Assessment)<\/code><\/p>\n"},{"acf_fc_layout":"content","content":"<h3>JSON in a feature layer<\/h3>\n<p>In this blog, we have explored how to store a feature form definition in a web map using Field Maps Designer. If multiple web maps contain the same feature layer, each web map could specify a different feature form definition. Sometimes, however, it may be advantageous to store a feature form definition in the feature layer itself. This allows for a single source of truth for the form definition, making it easier to manage and update. Each web map that includes that feature layer will automatically use the same form definition.<\/p>\n<details>\n<summary><span style=\"color: purple;font-style: bold\">\u2295 JSON for feature form definition in a feature layer &#8230;<\/span><\/summary>\n<div>\n<pre><code style=\"color: #24292e;background: #ffffff;padding: 1em\">\r\n{\r\n    <span style=\"color: #005cc5\">\"layers\"<\/span>: [\r\n        {\r\n            <span style=\"color: #005cc5\">\"id\"<\/span>: <span style=\"color: #005cc5\">0<\/span>,\r\n            <span style=\"color: #005cc5\">\"formInfo\"<\/span>: {\r\n                <span style=\"color: #005cc5\">\"formElements\"<\/span>: [\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"TREEID\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"TREEID\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"STATUS\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"STATUS\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"combo-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"noValueOptionLabel\"<\/span>: <span style=\"color: #032f62\">\"No value\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"showNoValueOption\"<\/span>: <span style=\"color: #005cc5\"><span style=\"color: #d73a49\">true<\/span><\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"HEIGHT\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"HEIGHT\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"SPREAD\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"SPREAD\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                        }\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"label\"<\/span>: <span style=\"color: #032f62\">\"DIAMETER\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"field\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"editableExpression\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"fieldName\"<\/span>: <span style=\"color: #032f62\">\"DIAMETER\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"inputType\"<\/span>: {\r\n                            <span style=\"color: #005cc5\">\"type\"<\/span>: <span style=\"color: #032f62\">\"text-box\"<\/span>,\r\n                            <span style=\"color: #005cc5\">\"minLength\"<\/span>: <span style=\"color: #005cc5\">0<\/span>\r\n                        }\r\n                    }\r\n                ],\r\n                <span style=\"color: #005cc5\">\"expressionInfos\"<\/span>: [\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"expression\"<\/span>: <span style=\"color: #032f62\">\"false\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"name\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/false\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"returnType\"<\/span>: <span style=\"color: #032f62\">\"boolean\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"False\"<\/span>\r\n                    },\r\n                    {\r\n                        <span style=\"color: #005cc5\">\"expression\"<\/span>: <span style=\"color: #032f62\">\"true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"name\"<\/span>: <span style=\"color: #032f62\">\"expr\/system\/true\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"returnType\"<\/span>: <span style=\"color: #032f62\">\"boolean\"<\/span>,\r\n                        <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"True\"<\/span>\r\n                    }\r\n                ],\r\n                <span style=\"color: #005cc5\">\"title\"<\/span>: <span style=\"color: #032f62\">\"Trees_For_All\"<\/span>\r\n            },\r\n            <span style=\"color: #005cc5\">\"popupInfo\"<\/span>: {\r\n                <span style=\"color: #6a737d\">\/\/ Popup elements would go here<\/span>\r\n\r\n            }\r\n        }\r\n    ],\r\n    <span style=\"color: #005cc5\">\"tables\"<\/span>: []\r\n}\r\n<\/code><\/pre>\n<\/div>\n<\/details>\n<p>&nbsp;<\/p>\n<p>You can create a feature form definition for the feature layer using the <strong>Form builder<\/strong> in Fields Map Designer. When you\u2019re finished, don\u2019t forget to save the feature form definition to the layer, using the <strong>Layer<\/strong> pane in the Map Viewer. You don\u2019t need to worry about saving the <strong>Untitled map<\/strong>.<\/p>\n"},{"acf_fc_layout":"kaltura","video_id":"1_m56ce9bw","time":false,"start":0,"stop":""},{"acf_fc_layout":"content","content":"<h3>Conclusion<\/h3>\n<p>You have seen how a feature form displayed using the <code>FeatureForm<\/code> component in the ArcGIS Maps SDK for Kotlin toolkit contains a variety of form elements, all of which look and behave like standard Android UI without any coding on your part. You then saw how little code is required to create and display a feature form in your code. The final section showed how to create a feature form definition for either a web map or a feature layer, using Form builder in Field Maps Designer.<\/p>\n<p>Next time you are crafting a mobile application using an ArcGIS Maps SDK for Native Apps, remember feature forms are <em>the<\/em> solution for enabling users to edit attributes in feature layers.<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<p>For a fully-functioning app, see the sample created with the ArcGIS Maps SDK for your language.<\/p>\n<ul>\n<li><a href=\"https:\/\/developers.arcgis.com\/kotlin\/sample-code\/edit-features-using-feature-forms\/\">Edit features using feature forms<\/a> (Kotlin)<\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/net\/maui\/sample-code\/edit-features-using-feature-forms\/\">Edit features using feature forms<\/a> (.NET)<\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/swift\/sample-code\/edit-features-using-feature-forms\/\">Edit features using feature forms<\/a> (Swift)<\/li>\n<\/ul>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false}],"show_article_image":false,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormWithKotlin-Card.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormWithKotlin2.png"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Feature forms in ArcGIS Maps SDK for Kotlin<\/title>\n<meta name=\"description\" content=\"Feature forms in an Android app created with Maps SDK for Kotlin. Code snippets. Create feature form definition with Field Maps Designer.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Feature forms in ArcGIS Maps SDK for Kotlin\" \/>\n<meta property=\"og:description\" content=\"Feature forms in an Android app created with Maps SDK for Kotlin. Code snippets. Create feature form definition with Field Maps Designer.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-16T23:30:57+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\"},\"author\":{\"name\":\"Mark Dugger\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/2e0d1888a15bb06d36d28392a0622930\"},\"headline\":\"Feature forms in ArcGIS Maps SDK for Kotlin\",\"datePublished\":\"2025-09-09T23:08:52+00:00\",\"dateModified\":\"2025-09-16T23:30:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\"},\"wordCount\":8,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"ArcGIS Content\",\"feature forms\",\"Field Maps Designer\",\"Smart Forms\"],\"articleSection\":[\"Data Management\",\"Developers\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\",\"name\":\"Feature forms in ArcGIS Maps SDK for Kotlin\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2025-09-09T23:08:52+00:00\",\"dateModified\":\"2025-09-16T23:30:57+00:00\",\"description\":\"Feature forms in an Android app created with Maps SDK for Kotlin. Code snippets. Create feature form definition with Field Maps Designer.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Feature forms in ArcGIS Maps SDK for Kotlin\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/2e0d1888a15bb06d36d28392a0622930\",\"name\":\"Mark Dugger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/67e81e3a8fe510c468de0483f768bf7051859967f0b42452e46caff91bc3ce26?s=96&d=blank&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/67e81e3a8fe510c468de0483f768bf7051859967f0b42452e46caff91bc3ce26?s=96&d=blank&r=g\",\"caption\":\"Mark Dugger\"},\"url\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Feature forms in ArcGIS Maps SDK for Kotlin","description":"Feature forms in an Android app created with Maps SDK for Kotlin. Code snippets. Create feature form definition with Field Maps Designer.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin","og_locale":"en_US","og_type":"article","og_title":"Feature forms in ArcGIS Maps SDK for Kotlin","og_description":"Feature forms in an Android app created with Maps SDK for Kotlin. Code snippets. Create feature form definition with Field Maps Designer.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2025-09-16T23:30:57+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin"},"author":{"name":"Mark Dugger","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/2e0d1888a15bb06d36d28392a0622930"},"headline":"Feature forms in ArcGIS Maps SDK for Kotlin","datePublished":"2025-09-09T23:08:52+00:00","dateModified":"2025-09-16T23:30:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin"},"wordCount":8,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["ArcGIS Content","feature forms","Field Maps Designer","Smart Forms"],"articleSection":["Data Management","Developers"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin","name":"Feature forms in ArcGIS Maps SDK for Kotlin","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2025-09-09T23:08:52+00:00","dateModified":"2025-09-16T23:30:57+00:00","description":"Feature forms in an Android app created with Maps SDK for Kotlin. Code snippets. Create feature form definition with Field Maps Designer.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/developers\/developers\/feature-forms-in-arcgis-maps-sdk-for-kotlin#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Feature forms in ArcGIS Maps SDK for Kotlin"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/2e0d1888a15bb06d36d28392a0622930","name":"Mark Dugger","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/67e81e3a8fe510c468de0483f768bf7051859967f0b42452e46caff91bc3ce26?s=96&d=blank&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/67e81e3a8fe510c468de0483f768bf7051859967f0b42452e46caff91bc3ce26?s=96&d=blank&r=g","caption":"Mark Dugger"},"url":""}]}},"text_date":"September 9, 2025","author_name":"Mark Dugger","author_page":false,"custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/FeatureFormWithKotlin2.png","primary_product":"Developers","tag_data":[{"term_id":22951,"name":"ArcGIS Content","slug":"arcgis-content","term_group":0,"term_taxonomy_id":22951,"taxonomy":"post_tag","description":"","parent":0,"count":333,"filter":"raw"},{"term_id":774592,"name":"feature forms","slug":"feature-forms","term_group":0,"term_taxonomy_id":774592,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":769742,"name":"Field Maps Designer","slug":"field-maps-designer","term_group":0,"term_taxonomy_id":769742,"taxonomy":"post_tag","description":"","parent":0,"count":8,"filter":"raw"},{"term_id":317872,"name":"Smart Forms","slug":"smart-forms","term_group":0,"term_taxonomy_id":317872,"taxonomy":"post_tag","description":"","parent":0,"count":35,"filter":"raw"}],"category_data":[{"term_id":23851,"name":"Data Management","slug":"data-management","term_group":0,"term_taxonomy_id":23851,"taxonomy":"category","description":"","parent":0,"count":927,"filter":"raw"},{"term_id":738191,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":738191,"taxonomy":"category","description":"","parent":0,"count":426,"filter":"raw"}],"product_data":[{"term_id":36571,"name":"ArcGIS Enterprise","slug":"arcgis-enterprise","term_group":0,"term_taxonomy_id":36571,"taxonomy":"product","description":"","parent":0,"count":980,"filter":"raw"},{"term_id":768902,"name":"ArcGIS Maps SDK for Kotlin","slug":"sdk-kotlin","term_group":0,"term_taxonomy_id":768902,"taxonomy":"product","description":"","parent":36601,"count":34,"filter":"raw"},{"term_id":36551,"name":"ArcGIS Online","slug":"arcgis-online","term_group":0,"term_taxonomy_id":36551,"taxonomy":"product","description":"","parent":0,"count":2435,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":765,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=developers","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2938256","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/395376"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2938256"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2938256\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2938256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2938256"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2938256"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2938256"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2938256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}