menu-菜单(选项菜单、上下文菜单、弹出式菜单)
1.选项菜单(按菜单键) optionmenu是相对于activity的菜单 需要按菜单键
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 创建选项菜单 ,如果设置隐藏标题就不会显示该菜单按钮了(右上角三个点) */ @Override public boolean onCreateOptionsMenu(Menu menu) { //将在xml文件中设置的菜单项添加到系统的menu里 getMenuInflater().inflate(R.menu.main, menu); //在代码中添加菜单项 //参数1 表示分组id,值通常为Menu.NONE 参数2:表示的是item的id 参数3:表示排序 参数4:表示的是菜单文本 menu.add(Menu.NONE, 1, 104, "在代码中添加的01"); menu.add(Menu.NONE, 2, 105, "在代码中添加的02"); //在代码中添加多级菜单 SubMenu subMenu = menu.addSubMenu(Menu.NONE, 3, 106, "代码中添加的包含子菜单"); subMenu.add(Menu.NONE, 4, 100, "第一个儿子"); subMenu.add(Menu.NONE, 5, 101, "第二个儿子"); return true; } /** * 选项菜单的单击事件 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item01: Toast.makeText(this, "点击-"+item.getTitle(), 0).show(); break; case R.id.item02: Toast.makeText(this, "点击-"+item.getTitle(), 0).show(); break; case R.id.item03: Toast.makeText(this, "点击item03", 0).show(); break; case R.id.item04_01: Toast.makeText(this, "点击item04_01", 0).show(); break; //为在代码中添加的菜单设置单击事件 case 1: Toast.makeText(this, "点击了在代码中添加的01", 0).show(); break; case 2: Toast.makeText(this, "点击了在代码中添加的02", 0).show(); break; case 4: Toast.makeText(this, "点击了-"+item.getTitle(), 0).show(); break; case 5: Toast.makeText(this, "点击了第二个儿子", 0).show(); break; } return super.onOptionsItemSelected(item); } /** *(选项菜单,上下文菜单)的菜单事件都会先执行该方法,再去执行相应的监听事件 */ @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { System.out.println("只要点击了菜单项就会执行,并且先于上面的事件"); return super.onMenuItemSelected(featureId, item); } }
说明:contextmenu和optionsmenu的点击事件都会先触发onMenuItemSelected该方法,然后该方法再根据menu特征分发到不同的
菜单相应事件,contextmenu触发onContextItemSelected, optionsmenu触发onOptionsItemSelected
menu下的main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- showAsAction代表菜单项显示的位置 设置为never就行(点击菜单项才显示出来) orderInCategory 代表菜单的排序(从小到大)
showAsAction 用来控制菜单的显示位置
当时同时设置了 titile和icon属性的时候 icon属性优先于title显示 ,
在折叠菜单中不会显示icon,只会显示title
在actionBar中长按图标会显示title的值
showAsAction的属性值:
never 从来不显示在actionbar始终显示在折叠菜单中(三个点里)
always 始终显示在actionbar上
ifRoom 如果actionbar上有空间,将该图标显示在actionbar上
withText 通常配合ifroom使用,当actionbar上有足够的空间的时候,会将图标和文本同时显示
collapseActionView 通常配合ifroom使用,当actionbar上有足够的空间的时候,会将菜单卷缩成图片
--> <item android:id="@+id/item01" android:orderInCategory="100" android:showAsAction="never" android:title="菜单项1"/> <item android:id="@+id/item02" android:orderInCategory="101" android:title="菜单项2"/> <item android:id="@+id/item03" android:orderInCategory="102" android:title="菜单项3"/> <!-- 添加子菜单 --> <item android:orderInCategory="103" android:title="包含子菜单"> <menu> <item android:id="@+id/item04_01" android:title="子菜单1"/> <item android:id="@+id/item04_02" android:title="子菜单1"/> </menu> </item> </menu>
效果图:
2.上下文菜单 contextmenu相对于view 需要长按对应的控件 以对话框的形式展示
1 public class MainActivity2 extends Activity { 2 private TextView tv; 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 tv = (TextView) findViewById(R.id.textview); 8 registerForContextMenu(tv);//为文本注册一个上下文菜单(长按该文本出现菜单选项) 9 } 10 @Override 11 public void onCreateContextMenu(ContextMenu menu, View v, 12 ContextMenuInfo menuInfo) { 13 getMenuInflater().inflate(R.menu.main2, menu);//注册菜单选项 14 super.onCreateContextMenu(menu, v, menuInfo); 15 16 } 17 @Override 18 public boolean onContextItemSelected(MenuItem item) {//菜单项单击事件 19 switch(item.getItemId()){ 20 case R.id.red: 21 tv.setBackgroundColor(Color.RED); 22 break; 23 case R.id.bull: 24 tv.setBackgroundColor(Color.BLUE); 25 break; 26 case R.id.green: 27 tv.setBackgroundColor(Color.GREEN); 28 break; 29 } 30 return super.onContextItemSelected(item); 31 } 32 }
menu下的main2.xml 菜单选项文件(在xml中添加菜单)
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.menu.MainActivity" > <item android:id="@+id/red" android:orderInCategory="101" android:title="红色"/> <item android:id="@+id/bull" android:orderInCategory="102" android:title="绿色"/> <item android:id="@+id/green" android:orderInCategory="103" android:title="蓝色"/> </menu>
3.弹出式菜单(如:按 按钮出现菜单) 泡泡菜单,菜单放在对应的控件下面,不能自动触发
1 public class MainActivity3 extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_main); 6 Button but=(Button) findViewById(id.button); 7 but.setOnClickListener(new View.OnClickListener() { 8 @Override 9 public void onClick(final View v) { 10 PopupMenu pop=new PopupMenu(MainActivity3.this, v);//new一个弹出式菜单 表示将popupmenu放到对应的控件下方(左对齐) 11 pop.getMenuInflater().inflate(R.menu.main, pop.getMenu());//注册菜单项 12 pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {//单击事件 13 @Override 14 public boolean onMenuItemClick(MenuItem item) { 15 switch (item.getItemId()) { 16 case R.id.start: 17 Toast.makeText(MainActivity3.this,"开始游戏", 0).show(); 18 break; 19 case R.id.set: 20 Toast.makeText(MainActivity3.this,"设置游戏", 0).show(); 21 break; 22 case R.id.item_01: 23 Toast.makeText(MainActivity3.this,"声音游戏", 0).show(); 24 break; 25 case R.id.item_02: 26 Toast.makeText(MainActivity3.this,"背景设置", 0).show(); 27 break; 28 case R.id.exit: 29 Toast.makeText(MainActivity3.this,"退出游戏", 0).show(); 30 break; 31 default: 32 break; 33 } 34 return false; 35 } 36 }); 37 pop.show();//显示 38 } 39 }); 40 } 41 42 }
menu下的main.xml 菜单选项文件(在xml中添加菜单)
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.menu.MainActivity" >
<item
android:id="@+id/start"
android:orderInCategory="101"
android:showAsAction="never"
android:title="开始游戏"/>
<item
android:id="@+id/set"
android:orderInCategory="101"
android:showAsAction="never"
android:icon="@android:drawable/ic_delete"
android:title="设置游戏">
<menu >
<item android:id="@+id/item_01"
android:orderInCategory="101"
android:showAsAction="never"
android:title="声音设置"/>
<item android:id="@+id/item_02"
android:orderInCategory="101"
android:showAsAction="never"
android:title="背景设置"/>
</menu>
</item>
<item
android:id="@+id/exit"
android:orderInCategory="101"
android:showAsAction="never"
android:title="退出游戏"/>
</menu>
item里的menu为子菜单
上面代码需要的布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textview" android:textSize="30sp" android:text="长按改变背景颜色" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/button" android:text="请选择"/> </RelativeLayout>