Android Menu Resources: Creating Application Menus with XML
Menu resources define application menus that can be inflated using MenuInflater, including option menus, context menus, and submenus.
Resource Location and Reference
File locatoin: res/menu/<em>filename</em>.xml
The filename becomes the resource ID.
Compiled resource type: A pointer to a Menu (or its subclsas) resource.
Resource reference:
- In Java:
R.menu.<em>filename</em> - In XML:
@[<em>package</em>:]menu.<em>filename</em>
XML Syntax Structure
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@[+][package:]id/resource_name"
android:title="string"
android:titleCondensed="string"
android:icon="@[package:]drawable/drawable_resource_name"
android:onClick="method name"
android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
android:actionLayout="@[package:]layout/layout_resource_name"
android:actionViewClass="class name"
android:actionProviderClass="class name"
android:alphabeticShortcut="string"
android:alphabeticModifiers=["META" | "CTRL" | "ALT" | "SHIFT" | "SYM" | "FUNCTION"]
android:numericShortcut="string"
android:numericModifiers=["META" | "CTRL" | "ALT" | "SHIFT" | "SYM" | "FUNCTION"]
android:checkable=["true" | "false"]
android:visible=["true" | "false"]
android:enabled=["true" | "false"]
android:menuCategory=["container" | "system" | "secondary" | "alternative"]
android:orderInCategory="integer" />
<group android:id="@[+][package:]id/resource name"
android:checkableBehavior=["none" | "all" | "single"]
android:visible=["true" | "false"]
android:enabled=["true" | "false"]
android:menuCategory=["container" | "system" | "secondary" | "alternative"]
android:orderInCategory="integer" >
<item />
</group>
<item >
<menu>
<item />
</menu>
</item>
</menu>
Element Details
<menu> Element
Required. Must be the root element. Contains <item> and/or <group> elements.
Attribute:
xmlns:android: XML namespace, required value is"http://schemas.android.com/apk/res/android"
<item> Element
Represents a menu item that may contain a <menu> element for submenus. Must be a child of <menu> or <group>.
Attributes:
android:id: Unique resource ID, use"@+id/<em>name</em>"to create new IDsandroid:title: String resource for the menu titleandroid:titleCondensed: Shorter title for space-constrained displaysandroid:icon: Drawable resource for menu item iconandroid:onClick: Method name called when item is clickedandroid:showAsAction: Controls when item appears as action item
showAsAction values:
ifRoom: Show as action if space permitswithText: Include title text with action itemnever: Never show as action itemalways: Always show as action itemcollapseActionView: Associated action view is collapsible
<group> Element
Groups menu items with shared characteristics like visibility, enablement, or checkability.
Attributes:
android:id: Group identifierandroid:checkableBehavior: Defines group's check behavior (none,all,single)android:visible: Visibility stateandroid:enabled: Enablement stateandroid:menuCategory: Category priorityandroid:orderInCategory: Ordering within category
Practical Example
XML file saved as res/menu/example_menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_search"
android:title="@string/search_label"
android:icon="@drawable/search_icon"
app:showAsAction="ifRoom|withText"/>
<group android:id="@+id/settings_group">
<item android:id="@+id/setting_one"
android:onClick="handleSettingClick"
android:title="@string/setting_one_label"
android:icon="@drawable/setting_one_icon" />
<item android:id="@+id/setting_two"
android:onClick="handleSettingClick"
android:title="@string/setting_two_label"
android:icon="@drawable/setting_two_icon" />
</group>
<item android:id="@+id/options_menu"
android:title="@string/options_label"
app:showAsAction="ifRoom|withText" >
<menu>
<item android:id="@+id/option_one"
android:title="@string/option_one_label" />
</menu>
</item>
</menu>
Application code implementing the menu inflation and click handlers:
Java implementation:
public boolean onCreateOptionsMenu(Menu targetMenu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.example_menu, targetMenu);
return true;
}
public void handleSettingClick(MenuItem clickedItem) {
switch (clickedItem.getItemId()) {
case R.id.setting_one:
// Handle setting one
break;
case R.id.setting_two:
// Handle setting two
break;
}
}
Kotlin implementation:
override fun onCreateOptionsMenu(targetMenu: Menu): Boolean {
menuInflater.inflate(R.menu.example_menu, targetMenu)
return true
}
fun handleSettingClick(clickedItem: MenuItem) {
when (clickedItem.itemId) {
R.id.setting_one -> {
// Handle setting one
}
R.id.setting_two -> {
// Handle setting two
}
}
}