- 添加方式
- 静态添加(引入xml)
- 动态添加(代码里写菜单)
- 菜单
- 选项菜单,OptionsMenu,每个Activity只有一个
- 子菜单,SubMenu
- 上下文菜单,ContextMenu,长按视图控件后出现的菜单
选项菜单
1、在res目录下新建一个menu文件,右击res目录 NEW Directory,输入人文件夹名menu,点击ok,在这个文件夹下新建名为main的菜单文件,即右击menu,NEW resourse file,文件名输入main,点击OK完成创建,然后在这个main.xml里添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add" />
<item android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
2、在Activity中重写 onCreateOptionsMenu()方法和 onOptionsItemSelected()方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/**
* 第一个参数:通过哪个资源文件来创建菜单
* 将菜单添加到哪个menu对象中
*/
getMenuInflater().inflate(R.menu.main, menu);
return true;//true表示菜单显示出来,false表示菜单不显示
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {//定义响应事件
case R.id.add_item:
Toast.makeText(MainActivity.this, "add_item", Toast.LENGTH_SHORT).show();
case R.id.remove_item:
Toast.makeText(MainActivity.this, "remove_item", Toast.LENGTH_SHORT).show();
}
return true;
}
子菜单
1、首先创建menu2.xml文件,与上一个创建步骤相同,不过代码不同,双层menu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/file"
android:title="文件"
>
<menu>
<item
android:id="@+id/file_new"
android:orderInCategory="100"
android:title="新建"
>
</item>
<item
android:id="@+id/file_open"
android:orderInCategory="100"
android:title="打开"
>
</item>
<item
android:id="@+id/file_s"
android:orderInCategory="100"
android:title="保存"
>
</item>
</menu>
</item>
<item
android:id="@+id/edit"
android:title="编辑"
>
<menu>
<item
android:id="@+id/edit_c"
android:orderInCategory="100"
android:title="复制"
>
</item>
<item
android:id="@+id/edit_v"
android:orderInCategory="100"
android:title="粘贴"
>
</item>
<item
android:id="@+id/edit_x"
android:orderInCategory="100"
android:title="剪切"
>
</item>
</menu>
</item>
</menu>
2、然后在Activity中对菜单进行显示并添加单击事件。
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu2,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.edit_c:
Toast.makeText(SecondActivity.this, "edit_c", Toast.LENGTH_SHORT).show();
case R.id.edit_v:
Toast.makeText(SecondActivity.this, "edit_v", Toast.LENGTH_SHORT).show();
//这里省略剩下的四个
}
return true;
}
上下文菜单
1、创建menu3.xml文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="复制" />
<item android:id="@+id/remove_item"
android:title="粘贴"/>
</menu>
2、重写onCreateContextMenu方法
3、为控件(listview)注册ContextMenu
public class ThirdActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> adapter;
private String[] data = {"1", "2", "3"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
listView = (ListView) findViewById(R.id.list);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, data);
listView.setAdapter(adapter);
registerForContextMenu(listView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.menu3, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
}
以上三个菜单,均使用的静态添加,接下来动态添加菜单
方法是menu.add()并提供四个参数(groupId,itemId,order,title), 其中itemId和title对应了xml中Item的id和title,groupId用来分组的Id,order是菜单项用来排序的。
选项菜单:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1, 1, 1, "设置1");
menu.add(1, 2, 2, "设置2");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {//定义响应事件
case 1:
Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
子菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu sub1 = menu.addSubMenu("sub1");
sub1.add(1, 1, 1, "sub1_sub1");
sub1.add(1, 2, 1, "sub1_sub2");
sub1.add(1, 3, 1, "sub1_sub3");
SubMenu sub2 = menu.addSubMenu("sub2");
sub2.add(2, 1, 1, "sub2_sub1");
sub2.add(2, 2, 1, "sub2_sub2");
sub2.add(2, 3, 1, "sub2_sub3");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getGroupId() == 1) {
switch (item.getItemId()) {
case 1:
Toast.makeText(FiveActivity.this, "sub1_sub1", Toast.LENGTH_SHORT).show();
break;
//省略剩下的两个
}
} else if (item.getGroupId() == 2) {
//省略剩下的三个
}
return super.onOptionsItemSelected(item);
}
上下文菜单
public class SixActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> adapter;
private String[] data = {"1", "2", "3"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_six);
listView = (ListView) findViewById(R.id.six_list);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, data);
listView.setAdapter(adapter);
registerForContextMenu(listView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
menu.setHeaderTitle("操作");//添加菜单的标题
SubMenu sub1 = menu.addSubMenu("sub1");
sub1.add(1, 1, 1, "sub1_sub1");
sub1.add(1, 2, 1, "sub1_sub2");
sub1.add(1, 3, 1, "sub1_sub3");
SubMenu sub2 = menu.addSubMenu("sub2");
sub2.add(2, 1, 1, "sub2_sub1");
sub2.add(2, 2, 1, "sub2_sub2");
sub2.add(2, 3, 1, "sub2_sub3");
super.onCreateContextMenu(menu, v, menuInfo);
}
}