AndroidPro4_005_Menus

# A menu item carries the following attributes:
    Name: A string title
    Menu item ID: An integer
    Group ID: An integer representing which group this item should be part of
    Sort order: An integer identifying the order of this menu item when it is displayed in the menu

# The sort-order attribute
    Secondary: start at 0x30000, defined by the constant Menu.CATEGORY_SECONDARY. such as system menus, alternative menus, and container menus-have different order-number ranges.
    System: start at 0x20000 and are defined by the constant Menu.CATEGORY_SYSTEM.
    Alternative: starts at 0x40000.defined by the constant Menu.CATEGORY_ALTERNATIVE.They’re usually contributed by external applications that provide alternative ways to deal with the data that is under consideration.
    Container:  starting at 0x10000, defined by the constant Menu.CATEGORY_CONTAINER.
# Creating a Menu
    3.0之前使用了菜单才会激活onCreateOpintionsMenu(), 3.0之后因为 action bar 总是在activity中显示,onCreateOpintionsMenu()总是在activity创建时调用.
@Override
public  boolean onCreateOptionsMenu(Menu menu)
{
     // call the base class to include system menus
     super.onCreateOptionsMenu(menu);
    menu.add(0     //  Group
                  ,1     //  item id
                  ,0     // order
                  ,"append");  //  title
    menu.add(0,2,1,"item2");
    menu.add(0,3,2,"clear");
     // It is important to return true to see the menu
     return  true;
}
# Menu Group
removeGroup(id)
setGroupCheckable(id, checkable, exclusive)
setGroupEnabled(id, boolean enabled)
setGroupVisible(id,visible)
# Responding to Menu Items Through Listeners

@Override
public  boolean onOptionsItemSelected(MenuItem item) {
     switch(item.getItemId()) {
     ..
     // for items handled
     return  true;
   
      // for the rest
     return  super.onOptionsItemSelected(item);
    }
}

    \ onMenuClickListener
// Step 1
public  class MyResponse  implements OnMenuClickListener
{
     // some local variable to work on
     //
     // Some constructors
    @override
     boolean onMenuItemClick(MenuItem item)
    {
         // do your thing
         return  true;
    }
}
// Step 2
MyResponse myResponse =  new MyResponse( );
menuItem.setOnMenuItemClickListener(myResponse);
    Note: onMenuItemClickListener executes when click, even before onOpintionsItemSelected() method is called. 
            If onMenuItemClick() return ture, no other callbacks are executed. 

# Other Menu Types

# Icon Menu
// add a menu item and remember it so that you can use it
// subsequently to set the icon on it.
MenuItem item = menu.add( );
item.setIcon(R.drawable.balloons);

#Submenus
private  void addSubMenu(Menu menu)
{
     // Secondary items are shown just like everything else
     int base=Menu.FIRST + 100;
    SubMenu sm = menu.addSubMenu(base,base+1,Menu.NONE,"submenu");
    sm.add(base,base+2,base+2,"sub item1");
    sm.add(base,base+3,base+3,"sub item2");
    sm.add(base,base+4,base+4,"sub item3");
     // submenu item icons are not supported
    item1.setIcon(R.drawable.icon48x48_2);
     // the following is ok however
    sm.setIcon(R.drawable.icon48x48_1);
     // This will result in runtime exception
     // sm.addSubMenu("try this");
}
    Note: you cannot add additional submenus to a submenu.

# Context Menus
    activity.onCreateContextMenu(); // Context menu is owned by a view, the method to populate context menus resides in the Activity class.
@Override
public  void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    TextView tv = (TextView) this.findViewById(R.id.textViewId);
    registerForContextMenu(tv);
}
    不是每个View都必须有Context Menus, 必须为需要的view注册一个context view: activity.registerForContextMenu(view)
@Override
public  void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
    menu.setHeaderTitle("Sample Context Menu");
    menu.add(200, 200, 200, "item1");
}
    responding to context menu clicks. onContextItemSelected() is also available on the Activity class.
@Override
public  boolean onContextItemSelected(MenuItem item)
{
     if (item.getitemId() = some-menu-item-id)
        {
             // handle this menu item
             return  true;
        }
      other exception processing
}
# Alternative Menus
??

# Loading Menus Through XML Files
    \ Structure of an XML Menu Resource File
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This group uses the  default category. -->
    <group android:id="@+id/menuGroup_Main">
    <item android:id="@+id/menu_testPick"
        android:orderInCategory="5"
        android:title="Test Pick" />
    <item android:id="@+id/menu_testGetContent"
        android:orderInCategory="5"
        android:title="Test Get Content" />
    <item android:id="@+id/menu_clear"
        android:orderInCategory="10"
        android:title="clear" />
    <item android:id="@+id/menu_dial"
        android:orderInCategory="7"
        android:title="dial" />
    <item android:id="@+id/menu_test"
        android:orderInCategory="4"
        android:title="@+string/test" />
    <item android:id="@+id/menu_show_browser"
        android:orderInCategory="5"
        android:title="show browser" />
    </group>
</menu>
   
    Inflating XML Menu Resource Files
@Override
public  boolean onCreateOptionsMenu(Menu menu)
{
    MenuInflater inflater = getMenuInflater();  // from activity
    inflater.inflate(R.menu.my_menu, menu);
     // It is important to return true to see the menu
     return  true;
}

    Responding to XML-Based Menu Items
private  void onOptionsItemSelected (MenuItem item)
{
     if (item.getItemId() == R.id.menu_clear)  //  xml生成的menu用 R.id.ooxx, 和前面code生成的 item id 不一样, item id是在menu.add()里第2个参数.
    {
         // do something
    }
     else  if (item.getItemId() == R.id.menu_dial)
    {
     // do something
    }
     etc
}
    3.0之后可以直接在XML中指定Menu callback method:
< item  android:id =" "
android:onClick
="a-method-name-in-your-activity"

</item
>

# Pop-up Menus in 4.0
< menu  xmlns:android ="http://schemas.android.com/apk/res/android" >
     <!--  This group uses the default category.  -->
     < group  android:id ="@+id/menuGroup_Popup" >
         < item  android:id ="@+id/popup_menu_1"
                 android:title ="Menu 1"   />
         < item  android:id ="@+id/popup_menu_2"
                 android:title ="Menu 2"   />
     </ group >
</ menu >
    Then:
// Other activity code goes here
// Invoke the following method to show a popup menu
private  void showPopupMenu()
{
     // Get hold of a view to anchor the popup
     // getTextView() can be any method that returns a view
    TextView tv = getTextView();
     // instantiate a popup menu
     // the var "this" stands for activity
    PopupMenu popup =  new PopupMenu( this, tv);
     // the following code for 3.0 sdk
     // popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
     // Or in sdk 4.0
    popup.inflate(R.menu.popup_menu);
    popup.setOnMenuItemClickListener( new PopupMenu.OnMenuItemClickListener()
    {
         public  boolean onMenuItemClick(MenuItem item)
        {
             // some local method to log that item
             // See the sample project to see how this method works
            appendMenuItemText(item);
             return  true;
        }
    }
);
popup.show();
}

# XML Menu Tags
    Group Category Tag
< group  android:id ="@+id/some_group_id "
            android:menuCategory ="secondary" >

    Checkable Behavior Tags
    use the checkableBehavior tag to control checkable behavior at a group level:
< group  android:id ="@+id/noncheckable_group"
            android:checkableBehavior ="none" >
    use the checked tag to control checkable behavior at an item level:
< item  android:id =".."
          android:title =""
          android:checked ="true"   />

    Tags to Simulate a Submenu
    submenu is represented as a menu element under a menu item:
< item  android:title ="All without group" >
     < menu >
         < item >
     </ menu >
</ item >

    Menu Icon Tag
< item  android:id =".. "
          android:icon ="@drawable/some-file"   />

    Menu Enabling/Disabling Tag
< item  android:id =".. "
         android:enabled ="true"
         android:icon ="@drawable/some-file"   />

    Menu Item Shortcuts
< item  android:id =" "
          android:alphabeticShortcut ="a"
        
</item
>

    Menu Visibility
< item  android:id =" "
         android:visible ="true"
        
</item
>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值