return(applyMenuChoice(item) ||
super.onOptionsItemSelected(item));
}
@Override
public boolean onContextItemSelected(MenuItem item) {
return(applyMenuChoice(item) ||
super.onContextItemSelected(item));
}
private void populateMenu(Menu menu) {
menu.add(Menu.NONE, ONE_ID, Menu.NONE, '1 Pixel');
menu.add(Menu.NONE, TWO_ID, Menu.NONE, '2 Pixels');
menu.add(Menu.NONE, EIGHT_ID, Menu.NONE, '8 Pixels');
menu.add(Menu.NONE, SIXTEEN_ID, Menu.NONE, '16 Pixels');
menu.add(Menu.NONE, TWENTY_FOUR_ID, Menu.NONE, '24 Pixels');
menu.add(Menu.NONE, THIRTY_TWO_ID, Menu.NONE, '32 Pixels');
menu.add(Menu.NONE, FORTY_ID, Menu.NONE, '40 Pixels');
}
private boolean applyMenuChoice(MenuItem item) {
switch (item.getItemId()) {
case ONE_ID:
getListView().setDividerHeight(1);
return(true);
case EIGHT_ID:
getListView().setDividerHeight(8);
return(true);
case SIXTEEN_ID:
getListView().setDividerHeight(16);
return(true);
case TWENTY_FOUR_ID:
getListView().setDividerHeight(24);
return(true);
case TWO_ID:
getListView().setDividerHeight(2);
return(true);
case THIRTY_TWO_ID:
getListView().setDividerHeight(32);
return(true);
case FORTY_ID:
getListView().setDividerHeight(40);
return(true);
}
return(false);
}
}
In onCreate()
, we register our list widget as having a context menu, which we fill in via our populateMenu()
private method, by way of onCreateContextMenu()
. We also implement the onCreateOptionsMenu()
callback, indicating that our activity also has an options menu. Once again, we delegate to populateMenu()
to fill in the menu.
Our implementations of onOptionsItemSelected()
(for options-menu selections) and onContextItemSelected()
(for context-menu selections) both delegate to a private applyMenuChoice()
method, plus chaining upwards to the superclass if none of our menu choices was the one selected by the user.
In populateMenu()
we add seven menu choices, each with a unique identifier. Being lazy, we eschew the icons.
In applyMenuChoice()
we see if any of our menu choices were chosen; if so, we set the list’s divider size to be the user-selected width.
Initially the activity looks the same in the emulator as it did for ListDemo
(see Figure 11- 1).

Figure 11-1.
But if you press the Menu button, you will get our options menu (Figure 11-2).

Figure 11-2.
Clicking the More button shows the remaining two menu choices (Figure 11-3).

Figure 11-3.
Choosing a height (say, 16 pixels) then changes the divider height of the list to something garish (Figure 11 -4).

Figure 11-4.
You can trigger the context menu by doing a tap-and-hold on any item in the list (Figure 11-5).

Figure 11-5.
Once again, choosing an option sets the divider height.
Yet More Inflation
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.