知识点:
这次将继续上一篇文章没有讲完的menu的学习,上下文菜单(context menu)和弹出菜单(popup menu)。
上下文菜单
上下文菜单提供对ui界面上的特定项或上下文框架的操作,就如同windows中右键菜单一样。
在android中,有两种提供上下文操作的方式:一种是在浮动的上下文菜单(长按弹出)中,另一种是上下文操作模式里。
那么怎样创建一个浮动的上下文菜单(floating context menu)呢?
1.调用registerforcontextmenu()方法为view注册上下文菜单。
2. 在activity或fragment中实现oncreatecontextmenu()方法。
3.实现oncontextitemselected()方法以响应用户长按菜单项的事件。
下面是一个上下文菜单的demo:
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
|
private textview textview;
final int red = 0x101 ;
final int blue = 0x102 ;
final int green = 0x103 ;
@override
protected void oncreate(bundle savedinstancestate) {
super .oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
textview=(textview)findviewbyid(r.id.textview);
//给textview注册上下文菜单
registerforcontextmenu(textview);
}
//创建上下文菜单
@override
public void oncreatecontextmenu(contextmenu menu, view v,
contextmenuinfo menuinfo) {
menu.add( 0 , red, 0 , "red" );
menu.add( 0 , blue, 0 , "blue" );
menu.add( 0 ,green, 0 , "green" );
menu.setheadertitle( "set the color of the textview" );
menu.setgroupcheckable( 0 , true , true );
}
//菜单项响应事件
@override
public boolean oncontextitemselected(menuitem item) {
switch (item.getitemid()) {
case green:
item.setchecked( true );
textview.setbackgroundcolor(color.green);
break ;
case blue:
item.setchecked( true );
textview.setbackgroundcolor(color.blue);
break ;
case red:
item.setchecked( true );
textview.setbackgroundcolor(color.red);
break ;
}
return true ;
}
|
使用上下文操作模式
上下文操作模式是实现系统actionmode接口,关注用户的交互来实现上下文操作行为。当用户通过选择菜单项来触发这个模式,一个可供用户对刚选择的菜单项进行操作的上下文action bar出现在屏幕顶部。用户可选择多项(select multi items)、取消选择(deselect)、操作完成(done)、返回(back)等操作。
那么什么时候调用上下文操作模式呢?
在下面两种情况下调用:
1.用户对view执行长按(long-click)操作。
2.用户在view中选择了复选框(checkbox)或者类似的ui组件。
怎么启用上下文操作模式呢?
这也分两种情况:
1.针对独立的view
首先实现 actionmode.callback接口,然后调用startactionmode()方法。
2.针对listview或girdview(或其他abslistview的拓展)
实现 abslistview.multichoicemodelistener接口,调用setmultichoicemodelistener()方法,最后传入choice_mode_multiple_modal参数调用setchoicemode()方法。
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
|
private listview listview;
@override
protected void oncreate(bundle savedinstancestate) {
super .oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
listview=(listview)findviewbyid(r.id.listview1);
string arr[]={ "new york" , "shanghai" , "los angle" , "beijing" , "paris" , "tykyo" , "moscow" , "berlin" , "hongkong" };
//将数组包装成arrayadapter
arrayadapter<string> adapter1= new arrayadapter<string>( this ,r.layout.array_item ,arr);
listview.setadapter(adapter1);
listview.setchoicemode(listview.choice_mode_multiple_modal);
listview.setmultichoicemodelistener( new multichoicemodelistener() {
@override
public boolean onprepareactionmode(actionmode mode, menu menu) {
// todo auto-generated method stub
return false ;
}
@override
public void ondestroyactionmode(actionmode mode) {
// todo auto-generated method stub
}
@override
public boolean oncreateactionmode(actionmode mode, menu menu) {
// todo auto-generated method stub
menuinflater inflater = mode.getmenuinflater();
inflater.inflate(r.menu.contextmenu, menu);
return true ;
}
@override
public boolean onactionitemclicked(actionmode mode, menuitem item) {
switch (item.getitemid()) {
case r.id.done:
toast.maketext(mainactivity. this , "you have clicked the done" , toast.length_long).show();
break ;
case r.id.cancel:
toast.maketext(mainactivity. this , "you have clicked the cancel" , toast.length_long).show();
default :
break ;
}
return true ;
}
@override
public void onitemcheckedstatechanged(actionmode mode, int position,
long id, boolean checked) {
// todo auto-generated method stub
}
});
}
|