But if you press the Menu button, you will get our options menu (Figure 11-2).
Figure 11-2. The same application, showing the options menu
Clicking the More button shows the remaining two menu choices (Figure 11-3).
Figure 11-3. The same application, the remaining menu choices
Choosing a height (say, 16 pixels) then changes the divider height of the list to something garish (Figure 11-4).
Figure 11-4. The same application, made ugly
You can trigger the context menu by doing a tap-and-hold on any item in the list (Figure 11-5).
Figure 11-5. The same application, showing a context menu
Once again, choosing an option sets the divider height.
You saw in Chapter 9 that you can describe Views
via XML files and inflate them into actual View
objects at runtime. Android also allows you to describe menus via XML files and inflate them when a menu is called for. This helps you keep your menu structure separate from the implementation of menu-handling logic, and it provides easier ways to develop menu-authoring tools.
Menu XML goes in res/menu/
in your project tree, alongside the other types of resources that your project might employ. As with layouts, you can have several menu XML files in your project, each with their own filename and the .xml
extension.
For example, from the Menus/Inflation
sample project at http://apress.com/, here is a menu called sample.xml
:
android:title="Close"
android:orderInCategory="3"
android:icon="@drawable/eject" />
android:orderInCategory="2"
android:title="Sans Icon" />
android:orderInCategory="4"
android:enabled="false"
android:title="Disabled" />
android:menuCategory="secondary"
android:visible="false">
android:orderInCategory="0"
android:title="2nd-To-Last" />
android:orderInCategory="1"
android:title="Last" />
android:orderInCategory="3"
android:title="A Submenu">
android:title="Non-Ghost"
android:visible="true"
android:alphabeticShortcut="n" />
android:title="A Ghost"
android:visible="false"
android:alphabeticShortcut="g" />
Note the following about menu XML definitions:
• You must start with a menu
root element.
• Inside a menu
are item
elements and group
elements, the latter representing a collection of menu items that can be operated upon as a group.
• Sub-menus are specified by adding a menu
element as a child of an item
element, using this new menu
element to describe the contents of the sub-menu.
• If you want to detect when an item is chosen or to reference an item or group from your Java code, be sure to apply an android:id
, just as you do with View layout XML.
Inside the item and group elements you can specify various options, matching up with corresponding methods on Menu
or MenuItem
.
Title
The title of a menu item is provided via the android:title
attribute on an item element. This can be either a literal string or a reference to a string resource (e.g., @string/foo
).
Icon
Menu items can have icons. To provide an icon — in the form of a reference to a drawable resource (e.g., @drawable/eject
), use the android:icon
attribute on the item element.
Order
By default, the order of the items in the menu is determined by the order they appear in the menu XML. If you want, you can change that default by specifying the android:orderInCategory
attribute on the item
element. This is a 0-based index of the order for the items associated with the current category. There is an implicit default category; groups can provide an android:menuCategory
attribute to specify a different category to use for items in that group.
Generally, though, it is simplest just to put the items in the XML in the order you want them to appear.
Enabled
Items and groups can be enabled or disabled, controlled in the XML via the android:enabled
attribute on the item or group element. By default, items and groups are enabled. Disabled items and groups appear in the menu but cannot be selected. You can change an item’s status at runtime via the setEnabled()
method on MenuItem
, or change a group’s status via setGroupEnabled()
on Menu
.
Visible
Similarly, items and groups can be visible or invisible, controlled in the XML via the android:visible
attribute on the item or group element. By default, items and groups are visible. Invisible items and groups do not appear in the menu at all. You can change an item’s status at runtime via the setVisible()
method on MenuItem
, or change a group’s status via setGroupVisible()
on Menu
.
In the layout XML shown earlier, the other_stuff
group is initially invisible. If we make it visible in our Java code, the two menu items in the group will “magically” appear.
Shortcut
Items can have shortcuts — single letters ( android:alphabeticShortcut
) or numbers ( android:numericShortcut
) that can be pressed to choose the item without having to use the touch screen, D-pad, or trackball to navigate the full menu.
Actually using a menu, once it’s defined in XML, is easy. Just create a MenuInflater
and tell it to inflate your menu:
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
theMenu = menu;
new MenuInflater( getApplication()).
inflate(R.menu.sample, menu);
return( super. onCreateOptionsMenu(menu));
}
Inevitably, you’ll get the question “Hey, can we change this font?” when doing application development. The answer depends on what fonts come with the platform, whether you can add other fonts, and how to apply them to the widget or whatever needs the font change.
Android is no different. It comes with some fonts plus a means for adding new fonts. Though, as with any new environment, there are a few idiosyncrasies to deal with.
Читать дальше