android电视菜单设计,Android开发(用户界面-创建菜单)

创建菜单 Creating Menus2 x" Q1 ~6 e' o5 c6 H% S$ j

/ o, c/ @5 T$ ~9 n# X6 N       菜单是任何应用程序的一个重要部分,提供了透露应用程序功能和设置的通用接口。Android为开发者提供了一个简单的编程接口来实现各种条件下的标准化应用程序菜单。% N& {3 O; x( L2 I

4 U9 l; w, n$ i4 u* R

Android提供了三种基础菜单类型:% r4 M0 L4 q, F3 H% I0 M

( u$ W- S$ Q9 h. @* D; M# }3 l9 H2 E

4 s+ f" t! a1 A! f- J

选项菜单Options Menu

# Z3 p3 ]- \- t% Q   3 h, n) Y5 a- \/ \2 @) {      这是一个活动的主菜单。通过按下设备菜单键来显示它。选项菜单包含两组菜单项:

4 N2 m8 [7 ^  u0 }5 U2 k! I  T

/ d" V; a; W, D9 z" d/ X: y% S. A& ?6 O

# Z4 @4 e) k% \& t% P/ V      图标菜单Icon Menu

; Y# i' S8 v5 Q& M: \' R: R* s7 A6 R1 Z

7 R3 c- H2 t) A/ r. ]       这个是当用户按下菜单键时最初出现屏幕下方的item集合。它支持最多6个菜单项。只有这些菜单支持图标而且这些菜单并不支持checkboxes或者radio buttons。6 D/ z9 Q6 @$ U0 c. h! M! ]

( R# [0 d2 g: [% t6 S/ b7 g

6 `' E0 q" w+ F0 m, T1 ^  L8 H% a

1 [' {3 O: S* F, k2 e: ?       扩展菜单Expanded Menu4 ^( q/ g6 m, ?4 v

$ B+ f: \% ^. G, i* g       这是通过按“更多”菜单显现出来的一个竖向的项目列表。它仅当图标菜单过多时存在而且是由6个以及其它选项菜单组成。9 C3 h, U4 V" V# ~* ^! K

8 u8 e" x0 A1 i5 Y/ a

$ E& O2 |% Y* M2 I: Z

$ }$ k' ]4 X" E0 ~% ?  n* Z: ?     上下文菜单Context Menu% v+ A! S4 U& D9 V9 Q2 V/ r

3 P+ |) T2 h- J       这是一个浮动菜单列表,通常在你长时间按在一个视图上时出现(比如一个列表项)2 }' g, k$ d6 [

6 ?% U. _. c, Q" v

6 ^7 m" Y" p8 M% Q2 E$ R% k- X9 F   * f! M7 V4 x% _, D2 D

子菜单Submenu

$ P9 _( Y* o$ I3 C  |

# T7 S- S8 C5 o       这是一个浮动菜单列表,通过在选项菜单或上下文菜单选择菜单项显露出来。不支持嵌套子菜单。5 x; e1 J6 U! ?' c8 ^7 P

( p  ]$ S# b" R) o

- P' J9 f: g* O  e% c& o   . {& O  A7 S8 j

- B1 P- k( h, ^4 H) N9 V  H/ J

- {0 h: @  }6 p2 s

这个选项菜单通过按设备菜单键打开。打开后,出现图标菜单,可包含6个菜单项。如果添加多于6个菜单项,多出的部分将通过“更多”菜单项在扩展菜单中显示。扩展菜单项在多于6个菜单项时自动添加。

" S+ L3 Y3 X  v% {* {   # d! b# ?+ o& \& t# K

选项菜单应该包含应用程序的基本功能以及任何必要的浏览项(例如,返回桌面或应用程序设置)。你还可以通过增加子菜单Submenus来组织主题和包含额外的菜单功能。

% J- Y7 ?1 s2 b   7 |% @4 z, W/ n5 K7 K. w! {

当菜单第一次被打开时,系统会调用活动onCreateOptionsMenu()回调函数。重写该方法并生成传递给你的这个菜单对象。你可以通过扩充定义在XML文件中的一个菜单资源或者通过为你想要的每一个菜单项调用add()方法生成这个菜单。这个方法增加一个菜单项MenuItem,并返回新创建的对象。你可以用返回的MenuItem来设置附加属性如图标,快捷键,意图以及这个菜单项的其它设置。$ q2 S' ?: Y6 F, f( k

6 \  h# S9 s3 h, R: x( i       有多个add()方法。通常,你会使用接受一个itemId参数的那个。这是一个唯一的整数,允许你在回调函数中识别这个item。( z& h6 u# l; f" H  d7 g$ K

# o8 w, a. _- F1 F: P8 b* V8 {       当一个菜单项从选项菜单中被选择时,你会接收到一个onOptionsItemSelected()回调。这个回调传给你选中的MenuItem。你可以通过请求itemId:getItemId()来识别它,这将返回add()方法分配的整数。一旦你识别了这个菜单项,就可以采取合适的动作。

, R7 j% g. d& b* i, G

* I* H2 D; @& r2 o# ~# {9 E; q% ?7 _! o! I1 e2 W

$ o+ j7 Y8 m" d  C

下面是一个活动里的例子,其中我们创建了一个选项菜单并处理菜单项的选择:

5 `. C, u2 K, i3 r   & q3 q" e. Z  b: c! _- u

7 X: C# `& ]: }9 D7 Z# G  k

) N* m# Q& a% b. u: I; `$ x' |Java代码:/* Creates the menu items */. W: K" @0 b0 I

6 W3 t+ X' B; k$ G. |- y) w

public boolean onCreateOptionsMenu(Menu menu) { 3 G' F; z6 _1 |

* J3 |) `) K, ?1 L- _2 E3 n% Mmenu.add(0, MENU_NEW_GAME, 0, “New Game”);

# a, O- B* v- g

6 V1 R4 R" B% V0 f! ~; H' g! r2 Tmenu.add(0, MENU_QUIT, 0, “Quit”);

+ }6 l: v: `1 R* l

; f- C* C8 s+ _; s! x" N$ [4 }return true;}

: u' a+ S3 D" _/ D- q   - k) C0 T' E3 w& `( z8 H6 r+ ?9 s

# m' }# Z3 x8 c: \) \

. v# |, h4 k; E' S9 \/* Handles item selections */2 ?/ a4 U7 b  p5 k: X

6 N; H6 F& M! z! `! |public boolean onOptionsItemSelected(MenuItem item) { 7 d, D  U0 [; ^! H- t

4 Z" d4 }! L" a1 Wswitch (item.getItemId()) { / T/ O6 c8 ^1 v; K! v! m  k

- v8 {% _6 h% i. Scase MENU_NEW_GAME: newGame();

$ Q: h- ?) O5 A1 H( W   % r8 W6 k: b5 u

return true; case MENU_QUIT: quit();

- U2 }; P5 N& o9 Q1 @3 d- [   1 t* \6 B0 S$ Z# L( d! Q% A1 `6 K8 H4 R

return true; & @$ j8 N; D5 \- q5 x

. {, k  k8 @# ^, R

} & X/ x3 j, T' N! W2 n+ O

2 b1 F! y6 ]  H; q) j- xreturn false;) `9 ~/ w+ h6 O% M) ~

+ x7 @  `" J% F9 a: d$ o, v} 复制代码[/I]这个add()方法有四个参数:groupId, itemId, order, 和 title。groupId 允许你关联这个菜单到一个菜单组中(更多参见下面的菜单组Menu groups)-这个例中,我们忽略掉它。itemId是用来识别菜单项的唯一的整数,在回调函数中使用。order 允许我们定义菜单的显示顺序-缺省情况下,它们以添加时的顺序排列。title当然是菜单的名字(可以是一个字符串资源,为了本地化更加方便,建议你使用资源)。

4 o& ^; Q3 t% y' [6 n   $ {3 r, v) n- `9 v$ _

提示: 如果你有一些可以以一个标题归类的菜单项,考虑以子菜单Submenu的方式组织它们。% t2 R  @) W# C& _4 V* I6 ~

$ P# \+ {0 R, l) t       增加图标Adding icons

, \3 j3 p8 G2 U

; J7 K4 B& v, U4 V       图标也可以通过setIcon()函数被添加到菜单项中。. _: P& k2 m- i

( l8 a4 b9 F7 P7 n2 M! zJava代码:

2 J$ _$ x; s7 @0 k5 P7 L4 t

4 h4 R8 I% ^; V/ z) \$ [- H9 ~) W% K, M

* y# l4 u" ]2 a/ p

menu.add(0, MENU_QUIT, 0, “Quit”) .setIcon(R.drawable.menu_quit_icon);复制代码[/I]

z7 L5 a$ e" X1 U) ~" m2 N     修改菜单Modifying the menu% }) g" e, L% N/ I0 r' M

; A( I7 w2 I* n" g. A       如果有些时候你想在选项菜单被打开的时候re-write它,可以override onPrepareOptionsMenu()方法,该方法在每一次菜单被打开的时候调用。它将传递给你菜单对象,就像回调一样。这对于根据应用程序状态调整菜单选项很有用。" v6 e! b" O) a8 O  H" l

3 r7 D3 Q2 k% g, c& x* m2 m       注意: 当改变菜单项时,根据当前选择的item来这样做是一个不好的行为。记住,在触摸模式中,将不会有一个选择或聚焦的item。相反,当你想基于UI中的某个特定item来提供功能时,你应该使用一个Context Menu 来完成这种行为。$ Q& f8 q: O7 c% G$ f

: j, ?7 s1 b: t7 T! Y       编辑本段 回目录上下文菜单Context Menu

: w3 ~! f6 D) C% \, |# D

' [  D8 P9 h$ r, z3 |       Android的上下文菜单在概念上和PC软件的右键菜单类似。当一个视图注册到一个上下文菜单时,执行一个在该对象上的“长按”(按住不动差不多两秒钟)动作,将出现一个提供相关功能的浮动菜单。上下文菜单可以被注册到任何视图对象中,不过,最常见的是用于列表视图ListView的item,在按中列表项时,会转换其背景色而提示将呈现上下文菜单。 (电话联系人列表提供了关于这个特性的一个很好的例子)。' W5 m) [' @" v! J# Y* @8 e9 I5 y

' a3 M7 M" s- _4 F0 I: u

注意:上下文菜单项不支持图标或快捷键。- q; w2 @% @4 g: M

) G& T! q% r6 D8 V& t# A+ A

# y* C# B2 y. R! H3 ~, }8 Z. U3 U   9 m) R3 C$ Y* ~" a

为了创建一个上下文菜单,你必须重写这个活动的上下文菜单回调函数:onCreateContextMenu() 和onContextItemSelected()。在回调函数onCreateContextMenu()里,你可以通过使用一个add()方法来添加菜单项,或者通过扩充一个定义在XML中的菜单资源。然后,通过registerForContextMenu()为这个视图注册一个上下文菜单ContextMenu.

5 t/ M( i9 ~. ]   ! Z$ d! i6 I9 s

( z+ a6 r9 r, x* m& F: G  D! e

7 l! b, W) v8 s       比如,下面的代码可以被用到Notepad应用程序中来为列表中的每一个注释添加一个上下文菜单:

9 Z4 K6 a% L) ?  q; y2 z0 e   - D$ A' O; w2 q

# u! v7 P/ h8 d- _   # u8 F: D1 E- i' s$ L& Y0 a

Java代码:

; D/ V/ b" j" ?+ q; N

5 u: p5 M  _7 {. L& M8 P" k' J$ F  d+ `; R3 ^3 K

. u" ?9 n/ G  X: u" l5 ]: z; O7 H  Z, bpublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo);

( f' b# r, _6 `( \   : A/ p1 Q$ |! r1 s- C$ \" A. u9 R

menu.add(0, EDIT_ID, 0, “Edit”); , C. D1 I* u' _+ a" u

- e: j3 u& J/ }9 p* T! _  N  I

menu.add(0, DELETE_ID, 0, “Delete”);5 ~: ?2 ~& T4 N, k; R5 S) w

6 s- r. w* d2 ]1 N+ D8 r. ^/ u$ J4 [

}

! N$ M6 a# w* w8 b4 b: K4 g

) v% h- }2 l+ ^2 M+ W 9 f( u( H" B% M1 a$ C& Z& w

8 b2 q1 O. h8 p2 H" A; Q8 X- A1 a0 Wpublic boolean onContextItemSelected(MenuItem item) {5 C+ d, b8 k' O; V0 @5 u

) X6 T, P, W; y" d% _ AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

4 S) k+ O, |) h( J+ I0 y   ( l5 M% E  g9 ~: i$ ^( N" d

switch (item.getItemId()) {

( C3 m' ~0 u7 X; B

/ D6 Y- U% Q' `1 `0 lcase EDIT_ID: editNote(info.id);

% N; H3 c# P+ ~   " d$ ^: J: Q2 F" k. U1 [' z" y" D

return true; case DELETE_ID: deleteNote(info.id);

+ K8 X' J5 e( q: o/ S" t2 k1 S

- E5 y6 o% q8 ~8 Wreturn true; default:

1 F+ K3 F1 {6 q9 N: {, B   2 A/ m3 D/ ~0 G/ |

return super.onContextItemSelected(item);

# U1 O) f7 s$ r2 a" |+ D5 F- G5 m! q

9 `2 s% Z, X+ Z* c}

# m+ T5 h5 x" M# S- D, \5 S9 c   : S2 y  @: q/ z) _. i+ L# Z  ]

9 ?; Z0 L. l$ f9 K0 Y" ]: x) s

' o1 k0 J9 j$ d( ]}复制代码[/I]

4 d5 i  d1 N# u- u   . D$ b# N7 K, f7 E* P

8 U0 ~& H3 t& f% n+ N5 o/ w# n   + F* s- F; ~+ }& v5 u

. s& o) |% o) R" T* M$ t) x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值