Android-菜单Menu.xml

介绍

菜单资源定义了可以弹出的应用程序菜单,使用MenuInflater载入

文件存放位置:res/menu/filename.xml
xml中的格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@[+][package:]id/resource_name"
android:title="string"
android:titleCondensed="string"
android:icon="@[package:]drawable/drawable_resource_name"
android:onClick="method name"
android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
android:actionLayout="@[package:]layout/layout_resource_name"
android:actionViewClass="class name"
android:actionProviderClass="class name"
android:alphabeticShortcut="string"
android:alphabeticModifiers=["META" | "CTRL" | "ALT" | "SHIFT" | "SYM" | "FUNCTION"]
android:numericShortcut="string"
android:numericModifiers=["META" | "CTRL" | "ALT" | "SHIFT" | "SYM" | "FUNCTION"]
android:checkable=["true" | "false"]
android:visible=["true" | "false"]
android:enabled=["true" | "false"]
android:menuCategory=["container" | "system" | "secondary" | "alternative"]
android:orderInCategory="integer" />
<group android:id="@[+][package:]id/resource name"
android:checkableBehavior=["none" | "all" | "single"]
android:visible=["true" | "false"]
android:enabled=["true" | "false"]
android:menuCategory=["container" | "system" | "secondary" | "alternative"]
android:orderInCategory="integer" >
<item />
</group>
<item >
<menu>
<item />
</menu>
</item>
</menu>

关键字

  • <menu> 根节点包含<item>和/或 <group>元素
    • xmlns:android 命名空间,必须为"http://schemas.android.com/apk/res/android"
  • <item> 菜单项,可以包含一个<menu>元素
    • android:id 资源id
    • android:title 菜单标题
    • android:titleCondensed 原始标题,用于标题过长
    • android:icon 菜单图标
    • android:onClick 点击菜单调用的方法
    • android:showAsAction 菜单如何显示
描述
ifRoom 如果有空间,则菜单显示在标题栏中
witchText 包括标题文本,可以使用管道符号分割
never 从不显示在标题栏,需要点击下拉
always 总是放在标题栏中
collapseActionView 与layout联动(用于Material Design)与android:actionLayoutorandroid:actionViewClass一起使用
  • android:actionLayout 布局资源,用作动作视图的布局
  • android:actionViewClass 作为动作视图的View名,例如:android.widget.SearchView
  • android:actionProviderClass 代替操作项的限定类名,例如:android.widget.ShareActionProvider
  • android:alphabeticShortcut 字母快捷键
  • android:numericShortcut 数字快捷键
  • android:alphabeticModifiers 菜单项的字母快捷键修饰符
描述
META 对应Meta元键
CTRL 对应Control元键
ALT 对应Alt元键
SHIFT 对应Shift元键
SYM 对应Sym元键
FUNCTIN 对应Function元键
  • android:numericModifiers 菜单项数字快捷键修饰符号,同上
  • android:checkable 是否可选中
  • android:checked 是否选中
  • android:visible 是否可见
  • android:enabled 是否启用
  • android:menuCategory 优先级
  • android:orderInCategory 组内的重要性顺序
描述
container 对于属于容器的项目。
system 对于系统提供的项目。
secondary 对于用户提供的辅助(不经常使用)选项的项目。
alternative 对于对当前显示的数据执行备用操作的项目。
  • <group> 菜单组包含一个或多个的<item>
    • android:id 资源id
    • android:checkableBehavior 可选中的行为
描述
none 不可选中
all 可以选中所有项目(使用复选框)
single 只能选中一个项目(使用单选按钮)
  • android:visible 是否可见
  • android:enabled 是否启用
  • android:menuCategory定义组优先级
  • android:orderInCategory 组内的重要性顺序

使用

res/menu/文件夹下面新建一个idea_menu.xml

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
>

<item android:title="分享"
app:showAsAction="always"
android:orderInCategory="2"/>
<item android:title="查看"
android:menuCategory="container"
android:orderInCategory="1"/>
</menu>

回到你要添加菜单的Activity中加入如下代码:

1
2
3
4
5
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.idea_menu,menu);
return super.onCreateOptionsMenu(menu);
}

即可

关于参数 app:actionViewClass 可扩展的菜单按钮,如果你点击该按钮,会显示出一个视图

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<item android:title="搜索"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"
android:orderInCategory="2"/>
<item android:title="查看"
android:menuCategory="container"
android:orderInCategory="1"/>
</menu>

效果如下:
正常情况下:
image.png
点击放大镜后:
image.png

上面的这个操作,归根到底,其实SearchView实现了一个接口CollapsibleActionView,那么,我们来学习以下SearchView相关的参数吧。

SearchView

SearchView所有参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.idea_menu,menu);
MenuItem searchItem=menu.findItem(R.id.search);

SearchView searchView= (SearchView) searchItem.getActionView();

//false 为直接展开
// searchView.setIconified(false);
//无法关闭,搜索框外有放大镜
// searchView.setIconifiedByDefault(false);
//无法关闭
// searchView.onActionViewExpanded();
//最大宽度
// searchView.setMaxWidth(500);
//提交按钮
// searchView.setSubmitButtonEnabled(true);
//搜索提示语
// searchView.setQueryHint("请输入你要搜索的内容");
//点击关闭的监听
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
Toast.makeText(getApplicationContext()
,"点击关闭"
,Toast.LENGTH_SHORT)
.show();
return false;
}
});
//点击搜索的按钮打开搜索框
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext()
,"点击按钮打开搜索框"
,Toast.LENGTH_SHORT)
.show();
}
});
//文字输入监听
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
//输入内容提交
Toast.makeText(getApplicationContext()
,"提交内容为:"+s
,Toast.LENGTH_SHORT)
.show();
return false;
}

@Override
public boolean onQueryTextChange(String s) {
//输入内容改变
Log.d(TAG, "输入文字改变: "+s);
return false;
}
});
return super.onCreateOptionsMenu(menu);
}

ShareActionProvider

使用分享下拉菜单

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
>

<item android:title="分享"
android:id="@+id/share"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
app:showAsAction="always"/>
</menu>

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.idea_menu,menu);
MenuItem searchItem=menu.findItem(R.id.share);
ShareActionProvider provider= (ShareActionProvider) MenuItemCompat.getActionProvider(searchItem);
Intent share_intent = new Intent();
share_intent.setAction(Intent.ACTION_SEND);//设置分享行为
share_intent.setType("text/plain");//设置分享内容的类型
share_intent.putExtra(Intent.EXTRA_SUBJECT, "标题");//添加分享内容标题
share_intent.putExtra(Intent.EXTRA_TEXT, "内容");//添加分享内容
provider.setShareIntent(share_intent);
return super.onCreateOptionsMenu(menu);
}

评论系统未开启,无法评论!