开发菜单和子菜单有两种方式;一是在Activity重写的方法onCreateOptionsMenu(Menu menu)方法中调用menu对象添加,然后在重写Activity的onOptionsItemSelected来响应选择的菜单项。二是通过资源文件 来定义菜单项,然后在onCreateOptionsMenu方法中加载这个xml资源。onCreateOptionsMenu方法在单击Menu键时 触发。


这里在资源文件中定义菜单项举例:


menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> 
 
<item android:id="@+id/action_settings" android:title="@string/action_settings"
 
android 
 :orderInCategory= 
 "100" 
 app 
 :showAsAction= 
 "never"
 
<item
 
android:title="连接"
 
//控制选项的顺序,小上大下
 
android:orderInCategory="10"
 
android:id="@+id/connect"
 
//定义显示的方式,always表示可以直接看到,never表示在...中隐藏,ifRoom表示如果有位置就显示,不然就出现在右边的三个点中
 
//要注意的一点是下面是app:而不是android:,原因似乎是包的问题, 
 因为我使用的是android.support.v7.app.ActionBarActivity。
 
app 
 :showAsAction= 
 "always"> 

 
<menu>
 
//子菜单需要使用grouo进行包围,在其中可以设置子菜单的选择方式,包括,single单选,all多选,none不可选(就是没有后面的小标记了)
 
<group android:checkableBehavior="single">
 
<item android:id="@+id/color_red"
 
android:title="红"/>
 
<item android:id="@+id/color_blue"
 
android:title="蓝"/>
 
<item android:id="@+id/color_green"
 
android:title="绿"/>
 
group> 

 
</menu>
 
</menu>


然后在MainActivity中重写onCreateOptionsMenu(Menu menu)方法,将menu文件载入


public boolean onCreateOptionsMenu(Menu menu) { 
 
     
 // Inflate the menu; this adds items to the action bar if it is present.
 
     getMenuInflater().inflate(R.menu. 
 menu_main, menu); 
 
     
 return true; 
 
}


然后重写onOptionsItemSelected(MenuItem item)方法,设置好这些点击触发事件


public boolean onOptionsItemSelected(MenuItem item) { 
 
     
 // Handle action bar item clicks here. The action bar will
 
     // automatically handle clicks on the Home/Up button, so long
 
     // as you specify a parent activity in AndroidManifest.xml.
 
     
  switch (item.getItemId()){ 
 
         
 case R.id. 
 action_settings: 
 
             Toast. 
 makeText(getApplicationContext(), 
 "设置",Toast. 
 LENGTH_SHORT).show(); 
 
             
 return true; 
 
         
 case R.id. 
 connect: 
 
             Toast. 
 makeText(getApplicationContext(), 
 "连接",Toast. 
 LENGTH_SHORT).show(); 
 
 return true;
 
     }
 
     return super.onOptionsItemSelected(item); 

 

  }


使用代码的方式进行菜单的添加


重写onCreateOptionsMenu(Menu menu)方法


public boolean onCreateOptionsMenu(Menu menu) {
 
   menu.add(0,1,Menu.NONE,"蓝牙发送").setIcon(android.R.drawable.ic_menu_send);
 
   //添加子菜单
 
   SubMenu subMenu = menu.addSubMenu(0,2,Menu.NONE,"重要程度").setIcon(android.R.drawable.ic_menu_share);
 
   subMenu.add(2,201,1,"string");
 
return true;
 
}

上下文菜单(就是长按有效)ContextMenu


先写一下onCreate()中的代码

protected void onCreate(Bundle savedInstanceState) {
 
super.onCreate(savedInstanceState); 
 
     
 //显示列表
 
     simpleShowList(); 
 
     
 //为所有列表项注册上下文菜单
 
     
  this.registerForContextMenu(getListView()); 
 
}

然后我们需要在simpleShowList()中使用适配器adapter将数据与样式进行绑定并设置。


//数据适配器 simple array adapter
ArrayAdapter<String> adapter =  
 new ArrayAdapter<String>( 
 this,android.R.layout. 
 simple_list_item_1,files); 
 
//填充列表 
this.setListAdapter(adapter);


之后需要将onCreateContextMenu()与onContextItemSelected()两个方法重写。


public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
 
     menu.setHeaderTitle( 
 "文件操作"); 
 
     menu.add( 
 0,  
 1, Menu. 
 NONE,  
 "蓝牙发送"); 
 
     menu.add( 
 0,  
 2, Menu. 
 NONE,  
 "标记重要"); 
 
     menu.add( 
 0,  
 3, Menu. 
 NONE,  
 "重命名"); 
 
     menu.add( 
 0, 
 4,Menu. 
 NONE, 
 "删除"); 
 
}


onContextItemSelected()方法就不在这里写出了,大概都是一致的。