blob: 7950907d88bb8133b2adc37b88c5999dcdc11857 [file] [log] [blame]
page.title=Menu
parent.title=Giao din Người dùng
parent.link=index.html
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Trong tài liu này</h2>
<ol>
<li><a href="#xml">Định nghĩa mt Menu trong XML</a></li>
<li><a href="#options-menu">To mt Menu Tùy chn</a>
<ol>
<li><a href="#RespondingOptionsMenu">X lý s kin nhp</a></li>
<li><a href="#ChangingTheMenu">Thay đổi các mc menu vào thi gian chy</a></li>
</ol>
</li>
<li><a href="#context-menu">To mt Menu Ng cnh</a>
<ol>
<li><a href="#FloatingContextMenu">To mt menu ng cnh ni</a></li>
<li><a href="#CAB">S dng chế độ hành động theo ng cnh</a></li>
</ol>
</li>
<li><a href="#PopupMenu">To mt Menu Bt lên</a>
<ol>
<li><a href="#PopupEvents">X lý s kin nhp</a></li>
</ol>
</li>
<li><a href="#groups">To Nhóm Menu</a>
<ol>
<li><a href="#checkable">S dng mc menu có th chn</a></li>
</ol>
</li>
<li><a href="#intents">Thêm Mc Menu da trên Ý định</a>
<ol>
<li><a href="#AllowingToAdd">Cho phép hot động ca bn được thêm vào các menu khác</a></li>
</ol>
</li>
</ol>
<h2>Lp khóa</h2>
<ol>
<li>{@link android.view.Menu}</li>
<li>{@link android.view.MenuItem}</li>
<li>{@link android.view.ContextMenu}</li>
<li>{@link android.view.ActionMode}</li>
</ol>
<h2>Xem thêm</h2>
<ol>
<li><a href="{@docRoot}guide/topics/ui/actionbar.html">Thanh Hành động</a></li>
<li><a href="{@docRoot}guide/topics/resources/menu-resource.html">Tài nguyên Menu</a></li>
<li><a href="http://android-developers.blogspot.com/2012/01/say-goodbye-to-menu-button.html">Nói
Tm bit vi Nút Menu</a></li>
</ol>
</div>
</div>
<p>Menu là mt thành phn giao din người dùng ph biến trong nhiu loi ng dng. Để cung cp mt
tri nghim người dùng quen thuc và nht quán, bn nên s dng các API {@link android.view.Menu} để trình bày
hành động người dùng và các tùy chn khác trong hot động ca mình.</p>
<p>Bt đầu vi Android 3.0 (API mc 11), các thiết b da trên nn tng Android không còn phi
cung cp mt nút <em>Menu</em> chuyên dng na. Vi s thay đổi này, các ng dng Android cn tránh khi
s ph thuc vào bng điu khin menu 6 mc truyn thng này mà thay vào đó cung cp mt thanh hành động để trình bày
các hành động người dùng thông dng.</p>
<p>Mc dù thiết kế và tri nghim người dùng đối vi mt s mc menu đã thay đổi, ng nghĩa để định nghĩa
tp hp hành động và tùy chn thì vn da trên các API {@link android.view.Menu}. Hướng dn
này trình bày cách to ba loi menu hay trình bày hành động cơ bn trên tt c
phiên bn Android:</p>
<dl>
<dt><strong>Menu tùy chn và thanh hành động</strong></dt>
<dd><a href="#options-menu">Menu tùy chn</a> là tp hp các mc menu cơ bn cho mt
hot động. Đó là nơi bn nên đặt các hành động có tác động chung ti ng dng, chng hn như
"Tìm kiếm," "Soạn e-mail" và "Cài đặt."
<p>Nếu bn đang phát trin cho phiên bn Android 2.3 hoc thp hơn, người dùng có th
hin bng điu khin menu tùy chn bng cách nhn nút <em>Menu</em>.</p>
<p>Trên phiên bn Android 3.0 tr lên, các mc t menu tùy chn được trình bày bi <a href="{@docRoot}guide/topics/ui/actionbar.html">thanh hành động</a>, là s kết hp gia các mc hành động
trên màn hình và các tùy chn tràn. Bt đầu vi phiên bn Android 3.0, nút <em>Menu</em> b b đi (mt s
thiết b
không có), vì thế bn nên chuyn sang s dng thanh hành động để cho phép truy cp vào hành động và
các tùy chn khác.</p>
<p>Xem phn v <a href="#options-menu">To mt Menu Tùy chn</a>.</p>
</dd>
<dt><strong>Menu ng cnh và chế độ hành động theo ng cnh</strong></dt>
<dd>Menu ng cnh là mt <a href="#FloatingContextMenu">menu ni</a> xut hin khi
người dùng thc hin nhp gi trên mt phn tử. Nó cung cp các hành động nh hưởng ti ni dung hoc
khung ng cnh được chn.
<p>Khi phát trin cho phiên bn Android 3.0 tr lên, thay vào đó, bn nên s dng <a href="#CAB">chế độ hành động theo ng cnh</a> để kích hot các hành động trên ni dung được chn. Chế độ này hin th
các mc hành động nh hưởng ti ni dung được chn trong mt thanh trên cùng ca màn hình và cho phép người dùng
chn nhiu mc.</p>
<p>Xem phn nói v <a href="#context-menu">To Menu Ng cnh</a>.</p>
</dd>
<dt><strong>Menu bt lên</strong></dt>
<dd>Menu bt lên s hin th danh sách các mc trong mt danh sách thng đứng được neo vào dng xem
đã gi ra menu. Nên cung cp mt phn tràn gm các hành động liên quan ti ni dung c th hoc
nhm cung cp các tùy chn cho phn th hai ca mt lnh. Các hành động trong mt menu bt lên
<strong>không</strong> nên trc tiếp nh hưởng ti ni dung tương ng&mdash;đó là vic ca hành động ng cnh
. Thay vào đó, menu bt lên áp dng cho các hành động m rng liên quan ti các vùng ni dung trong hot động
ca bn.
<p>Xem phn v <a href="#PopupMenu">To mt Menu Bt lên</a>.</p>
</dd>
</dl>
<h2 id="xml">Định nghĩa mt Menu trong XML</h2>
<p>Đối vi tt c các loi menu, Android cung cp mt định dng XML chun để định nghĩa các mc menu.
Thay vì xây dng mt menu trong mã ca hot động ca bn, bn nên định nghĩa mt menu và tt c các mc ca nó trong mt
<a href="{@docRoot}guide/topics/resources/menu-resource.html">tài nguyên menu</a> XML. Khi đó, bn có th
bung tài nguyên menu (ti nó như mt đối tượng {@link android.view.Menu}) trong hot động hoc
phân đon ca mình.</p>
<p>S dng mt tài nguyên menu là mt cách làm hay vì mt vài lý do:</p>
<ul>
<li>Nó d trc quan hóa cu trúc menu trong XML hơn.</li>
<li>Nó tách riêng ni dung cho menu vi mã hành vi ca ng dng ca bn.</li>
<li>Nó cho phép bn to các cu hình menu phái sinh cho các phiên bn nn tng,
kích c màn hình khác nhau và các cu hình khác bng cách tn dng khuôn kh <a href="{@docRoot}guide/topics/resources/index.html">tài nguyên ng dng</a>.</li>
</ul>
<p>Để định nghĩa menu, hãy to mt tp XML bên trong thư mc <code>res/menu/</code>
d án ca bn và xây dng menu vi các phn t sau:</p>
<dl>
<dt><code>&lt;menu></code></dt>
<dd>Định nghĩa mt {@link android.view.Menu}, đó là mt b cha các mc menu. Phn t
<code>&lt;menu></code> phi là mt nút gc cho tp và có th gi mt hoc nhiu phn t
<code>&lt;item></code> và <code>&lt;group></code>.</dd>
<dt><code>&lt;item></code></dt>
<dd>To mt {@link android.view.MenuItem}, nó biu din mt mc đơn trong mt menu. Phn t
này có th cha mt phn t <code>&lt;menu></code> được lồng nhau để tạo một menu con.</dd>
<dt><code>&lt;group></code></dt>
<dd>Mt b cha tùy chn, vô hình cho các phn t {@code &lt;item&gt;}. Nó cho phép bn
phân loi các mc menu sao cho chúng chia s các tính cht như trng thái hin hot và kh năng hin thị. Để biết thêm
thông tin, hãy xem phn nói v <a href="#groups">To Nhóm Menu</a>.</dd>
</dl>
<p>Sau đây là mt menu ví d có tên là <code>game_menu.xml</code>:</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
&lt;item android:id="@+id/new_game"
android:icon="@drawable/ic_new_game"
android:title="@string/new_game"
android:showAsAction="ifRoom"/&gt;
&lt;item android:id="@+id/help"
android:icon="@drawable/ic_help"
android:title="@string/help" /&gt;
&lt;/menu&gt;
</pre>
<p>Phn t <code>&lt;item></code> h tr mt vài thuc tính bn có th s dng để định nghĩa biu hin bên ngoài
và hành vi ca mt mc. Các mc trong menu trên bao gm nhng thuc tính sau:</p>
<dl>
<dt>{@code android:id}</dt>
<dd>Mt ID tài nguyên duy nht đối vi mc, nó cho phép ng dng có th nhn ra mc đó
khi người dùng chn nó.</dd>
<dt>{@code android:icon}</dt>
<dd>Mt tham chiếu ti mt ni dung v được để dùng làm biu tượng ca mc.</dd>
<dt>{@code android:title}</dt>
<dd>Mt tham chiếu ti mt xâu để dùng làm tiêu đề ca mc.</dd>
<dt>{@code android:showAsAction}</dt>
<dd>Quy định thi đim và cách thc mc này nên xut hin như mt mc hành động trong <a href="{@docRoot}guide/topics/ui/actionbar.html">thanh hành động</a>.</dd>
</dl>
<p>Đây là nhng thuc tính quan trng nht bn nên s dng, nhưng còn nhiu thuc tính sn có khác.
Để biết thông tin v tt c thuc tính được h trợ, hãy xem tài liu <a href="{@docRoot}guide/topics/resources/menu-resource.html">Tài nguyên Menu</a>.</p>
<p>Bn có th thêm mt menu con vào mt mc trong bt k menu nào (ngoi tr menu con) bng cách thêm mt phn t {@code &lt;menu&gt;}
làm con ca {@code &lt;item&gt;}. Các menu con thường hu ích khi ng dng ca bn có nhiu
chc năng mà có th được t chc thành các ch đề, như các mc trong thanh menu ca mt ng dng PC (Tp,
Chnh sa, Dng xem, v.v.). Ví dụ:</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
&lt;item android:id="@+id/file"
android:title="@string/file" &gt;
&lt;!-- "file" submenu --&gt;
&lt;menu&gt;
&lt;item android:id="@+id/create_new"
android:title="@string/create_new" /&gt;
&lt;item android:id="@+id/open"
android:title="@string/open" /&gt;
&lt;/menu&gt;
&lt;/item&gt;
&lt;/menu&gt;
</pre>
<p>Để s dng menu trong hot động ca mình, bn cn bung tài nguyên menu (chuyn tài nguyên XML
thành mt đối tượng có th lp trình) bng cách s dng {@link android.view.MenuInflater#inflate(int,Menu)
MenuInflater.inflate()}. Trong nhng phn sau, bn s biết cách bung mt menu đối vi mi
loi menu.</p>
<h2 id="options-menu">To mt Menu Tùy chn</h2>
<div class="figure" style="width:200px;margin:0">
<img src="{@docRoot}images/options_menu.png" height="333" alt="" />
<p class="img-caption"><strong>Hình 1.</strong> Các menu tùy chn trong
Trình duyt, trên Android 2.3.</p>
</div>
<p>Menu tùy chn là nơi bn nên đưa vào hành động và các tùy chn khác liên quan ti
ng cnh hot động hin ti, chng hn như "Tìm kiếm," "Soạn e-mail," và "Cài đặt."</p>
<p>Nơi mà các mc trong menu tùy chn ca bn xut hin trên màn hình s ph thuc vào phiên bn mà bn
phát trin ng dng ca mình cho:</p>
<ul>
<li>Nếu bn phát trin ng dng ca mình cho phiên bn <strong>Android 2.3.x (API mc 10) hoc
thp hơn</strong>, ni dung ca menu tùy chn s xut hin dưới cùng màn hình khi người dùng
nhn nút <em>Menu</em> như minh ha trong hình 1. Khi được mở, phn hin th đầu tiên là
menu biu tượng
vi ti đa sáu mc menu. Nếu menu ca bn bao gm nhiu hơn sáu mc, Android s đặt
mc th sáu và phn còn li vào mt menu tràn mà người dùng có th m bng cách chn
<em>Thêm na</em>.</li>
<li>Nếu bn phát trin ng dng ca mình cho phiên bn <strong>Android 3.0 (API mc 11) và
cao hơn</strong>, các mục từ menu tùy chọn sẵn ở trong <a href="{@docRoot}guide/topics/ui/actionbar.html">thanh hành động</a>. Theo mặc định, hệ thống
đặt tất cả các mục trong phần tràn hành động mà người dùng có thể hiện bằng biểu tượng tràn hành động phía
bên phải của thanh hành động (hoặc bằng cách nhấn nút <em>Menu</em> của thiết bị nếu có). Để
kích hoạt
truy cập nhanh vào các hành động quan trọng, bạn có thể đưa lên một vài mục xuất hiện trong thanh hành động bằng cách thêm
{@code android:showAsAction="ifRoom"} vào phần tử {@code &lt;item&gt;} tương ứng (xem hình
2). <p>Để biết thêm thông tin về các mục hành động và hành vi khác của thanh hành động, hãy xem hướng dẫn <a href="{@docRoot}guide/topics/ui/actionbar.html">Thanh Hành động</a>. </p>
<p class="note"><strong>Lưu ý:</strong> Ngay cả khi bạn <em>không</em> đang phát triển cho phiên bản Android 3.0 hoặc
cao hơn, bạn có thể xây dựng bố trí thanh hành động của chính mình cho hiệu ứng tương tự. Để xem ví dụ về cách bạn có thể hỗ trợ các phiên bản cao hơn
của Android bằng một thanh hành động, hãy xem mẫu <a href="{@docRoot}resources/samples/ActionBarCompat/index.html">Tương thích với Thanh Hành động</a>
.</p>
</li>
</ul>
<img src="{@docRoot}images/ui/actionbar.png" alt="" />
<p class="img-caption"><strong>Hình 2.</strong> Thanh hành động từ ứng dụng <a href="{@docRoot}resources/samples/HoneycombGallery/index.html">Honeycomb Gallery</a>, hiển thị
các tab điều hướng và một mục hành động máy ảnh (cộng với nút tràn hành động).</p>
<p>Bạn có thể khai báo các mục cho menu tùy chọn từ lớp con {@link android.app.Activity}
của bạn hoặc một lớp con {@link android.app.Fragment}. Nếu cả hoạt động của bạn và (các) phân đoạn
đều khai báo các mục cho menu tùy chọn, chúng sẽ được kết hợp lại trong UI. Các mục của hoạt động xuất hiện
trước, sau đó là các mục của từng phân đoạn theo thứ tự phân đoạn được thêm vào
hoạt động. Nếu cần, bạn có thể sắp xếp lại các mục menu bằng thuộc tính {@code android:orderInCategory}
trong mỗi {@code &lt;item&gt;} mà bạn cần di chuyển.</p>
<p>Để quy định menu tùy chọn cho một hoạt động, hãy khống chế {@link
android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} (các phân đoạn cung cấp
phương pháp gọi lại {@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()} của chính mình). Trong
phương pháp này, bạn có thể bung tài nguyên menu của mình (<a href="#xml">được định nghĩa trong XML</a>) vào {@link
android.view.Menu} được cung cp trong phương pháp gi li. Ví dụ:</p>
<pre>
&#64;Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = {@link android.app.Activity#getMenuInflater()};
inflater.inflate(R.menu.game_menu, menu);
return true;
}
</pre>
<p>Bn cũng có th thêm các mc menu bng cách s dng {@link android.view.Menu#add(int,int,int,int)
add()} và truy xut các mc bng {@link android.view.Menu#findItem findItem()} để xem lại
tính cht ca chúng bng các API {@link android.view.MenuItem}.</p>
<p>Nếu bn phát trin ng dng ca mình cho phiên bn Android 2.3.x và thp hơn, h thng gi {@link
android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} để tạo menu tùy chọn
khi người dùng m menu ln đầu tiên. Nếu bn phát trin cho phiên bn Android 3.0 vào cao hơn,
h thng s gi {@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} khi
bt đầu hot động để hin th các mc cho thanh hành động.</p>
<h3 id="RespondingOptionsMenu">X lý s kin nhp</h3>
<p>Khi người dùng chn mt mc t menu tùy chn (bao gm các mc hành động trong thanh hành động),
h thng s gi phương pháp {@link android.app.Activity#onOptionsItemSelected(MenuItem)
onOptionsItemSelected()} ca hot động ca bn. Phương pháp này thông qua {@link android.view.MenuItem} được chn. Bn
có th nhn biết mc bng cách gi {@link android.view.MenuItem#getItemId()}, nó trả về ID duy nhất
cho mc menu (được định nghĩa bi thuc tính {@code android:id} trong tài nguyên menu hoc bng mt
s nguyên được cp cho phương pháp {@link android.view.Menu#add(int,int,int,int) add()}). Bạn có thể khớp
ID này vi các mc menu đã biết để thc hin hành động phù hp. Ví dụ:</p>
<pre>
&#64;Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.new_game:
newGame();
return true;
case R.id.help:
showHelp();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
</pre>
<p>Khi bn x lý thành công mt mc menu, tr v {@code true}. Nếu không x lý được
mc menu, bn nên gi trin khai siêu lp ca {@link
android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} (triển khai
mc định tr v sai).</p>
<p>Nếu hot động ca bn bao gm các phân đon, trước tiên h thng s gi {@link
android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} cho hoạt động, rồi mới
cho tng phân đon (theo th t thêm phân đon) ti khi tr v
{@code true} hoc tt c phân đon đều được gi.</p>
<p class="note"><strong>Mo:</strong> Android 3.0 thêm kh năng cho phép bn định nghĩa hành vi
khi nhp đối vi mt mc menu trong XML, bng cách s dng thuc tính {@code android:onClick}. Giá tr cho
thuc tính phi là tên ca mt phương pháp được định nghĩa bi hot động s dng menu. Phương pháp
phi công khai và chp nhn mt tham s {@link android.view.MenuItem} đơn&mdash;khi h thng
gi phương pháp này, nó thông qua mc menu được chn. Để biết thêm thông tin và ví dụ, hãy xem tài liu <a href="{@docRoot}guide/topics/resources/menu-resource.html">Tài nguyên Menu</a>.</p>
<p class="note"><strong>Mo:</strong> Nếu ng dng ca bn cha nhiu hot động và
mt s chúng cung cp menu tùy chn tương tự, hãy xem xét to
mt hot động ch trin khai các phương pháp {@link android.app.Activity#onCreateOptionsMenu(Menu)
onCreateOptionsMenu()} và {@link android.app.Activity#onOptionsItemSelected(MenuItem)
onOptionsItemSelected()}. Sau đó, m rng lp này đối vi mi hot động cn chia s
menu tùy chn tương tự. Bng cách này, bn có th qun lý mt b mã để x lý các hành động
menu và tng lp hu du kế tha các hành vi menu.
Nếu bn mun thêm các mc menu vào mt trong các hot động hu duệ,
hãy khng chế {@link android.app.Activity#onCreateOptionsMenu(Menu)
onCreateOptionsMenu()} trong hot động đó. Gi {@code super.onCreateOptionsMenu(menu)} sao cho
các mc menu gc được to, sau đó thêm các mc menu mi bng {@link
android.view.Menu#add(int,int,int,int) menu.add()}. Bạn cũng có thể khống chế hành vi
ca siêu lp đối vi các mc menu riêng lẻ.</p>
<h3 id="ChangingTheMenu">Thay đổi các mc menu vào thi gian chy</h3>
<p>Sau khi h thng gi {@link android.app.Activity#onCreateOptionsMenu(Menu)
onCreateOptionsMenu()}, nó s gi li mt thc th ca {@link android.view.Menu} mà bn đưa vào và
s không gi li {@link android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()}
tr khi menu b vô hiu hóa vì lý do nào đó. Tuy nhiên, bn ch nên s dng {@link
android.app.Activity#onCreateOptionsMenu(Menu) onCreateOptionsMenu()} để tạo trạng thái menu
ban đầu ch không phi để thc hin thay đổi trong vòng đời ca hot động.</p>
<p>Nếu bn mun sa đổi menu tùy chn da trên
các s kin xy ra trong vòng đời ca hot động, bn có th làm vy trong phương pháp
{@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()}. Phương pháp
này chuyn cho bn đối tượng {@link android.view.Menu} như hin đang có để bn có th sa đổi nó,
chng hn như thêm, xóa bỏ, hoc vô hiu hóa các mc. (Phân đon cũng cung cp lnh gi li {@link
android.app.Fragment#onPrepareOptionsMenu onPrepareOptionsMenu()}.)</p>
<p>Trên phiên bn Android 2.3.x và thp hơn, h thng gi {@link
android.app.Activity#onPrepareOptionsMenu(Menu)
onPrepareOptionsMenu()} mi ln người dùng m menu tùy chn (nhn nút <em>Menu</em>
).</p>
<p>Trên phiên bn Android 3.0 tr lên, menu tùy chn được coi như luôn m khi các mc menu được
trình bày trong thanh hành động. Khi mt s kin xy ra và bn mun thc hin mt cp nht menu, bn phi
gi {@link android.app.Activity#invalidateOptionsMenu invalidateOptionsMenu()} để yêu cầu
h thng gi {@link android.app.Activity#onPrepareOptionsMenu(Menu) onPrepareOptionsMenu()}.</p>
<p class="note"><strong>Lưu ý:</strong>
Bn không nên thay đổi các mc trong menu tùy chn da trên {@link android.view.View} đang
trong tiêu đim. Khi chế độ cm ng (khi người dùng không s dng bi xoay hay d-pad), các dng xem
không th ly tiêu đim, vì thế bn không nên s dng tiêu đim làm cơ s để sa đổi
các mc trong menu tùy chn. Nếu bn mun cung cp các mc menu nhy cm vi ng cnh cho mt {@link
android.view.View}, hãy s dng mt <a href="#context-menu">Menu Ng cnh</a>.</p>
<h2 id="context-menu">To mt Menu Ng cnh</h2>
<div class="figure" style="width:420px;margin-top:-1em">
<img src="{@docRoot}images/ui/menu-context.png" alt="" />
<p class="img-caption"><strong>Hình 3.</strong> nh chp màn hình mt menu ng cnh ni (trái)
và thanh hành động ng cnh (phi).</p>
</div>
<p>Menu ng cnh s đưa ra các hành động nh hưởng ti mt mc hoc khung ng cnh c th trong UI. Bn
có th cung cp mt menu ng cnh cho bt k dng xem nào, nhưng chúng thường được s dng nhiu nht cho các mc trong mt {@link
android.widget.ListView}, {@link android.widget.GridView}, hoc các bộ sưu tp dng xem khác mà
người dùng có th thc hin hành động trc tiếp trên mi mc.</p>
<p>Có hai cách để cung cp các hành động ng cnh:</p>
<ul>
<li>Trong mt <a href="#FloatingContextMenu">menu ng cnh ni</a>. Menu xut hin như mt
danh sách ni gm nhiu mc menu (tương t như mt hp thoi) khi người dùng thc hin nhp gi (nhn và
giữ) trên mt dng xem có khai báo h tr menu ng cnh. Người dùng có th thc hin hành động
ng cnh trên mt mc vào mt thi đim.</li>
<li>Trong <a href="#CAB">chế độ hành động theo ng cnh</a>. Chế độ này là mt h thng trin khai
{@link android.view.ActionMode} có chc năng hin th mt <em>thanh hành động ng cnh</em> bên trên
màn hình vi các mc hành động nh hưởng ti (các) mc được chn. Khi chế độ này hin hot, người dùng
có th thc hin mt hành động trên nhiu mc ngay lp tc (nếu ng dng ca bn cho phép).</li>
</ul>
<p class="note"><strong>Lưu ý:</strong> Chế độ hành động theo ng cnh sn có trên phiên bn Android 3.0 (API
mc 11) và cao hơn và là k thut được ưu tiên cho vic hin th các hành động theo ng cnh khi
sn có. Nếu ng dng ca bn h tr các phiên bn thp hơn 3.0, vy bn nên quay li menu ng cnh
ni trên nhng thiết b đó.</p>
<h3 id="FloatingContextMenu">To mt menu ng cnh ni</h3>
<p>Để cung cp mt menu ng cnh ni:</p>
<ol>
<li>Đăng ký {@link android.view.View} mà menu ng cnh nên được liên kết vi bng cách
gi {@link android.app.Activity#registerForContextMenu(View) registerForContextMenu()} và chuyển
cho nó {@link android.view.View}.
<p>Nếu hot động ca bn s dng mt {@link android.widget.ListView} hoc {@link android.widget.GridView} và
bn mun tng mc cung cp cùng menu ng cnh, hãy đăng ký tt c mc cho mt menu ng cnh bng cách
chuyn {@link android.widget.ListView} hoc {@link android.widget.GridView} cho {@link
android.app.Activity#registerForContextMenu(View) registerForContextMenu()}.</p>
</li>
<li>Trin khai phương pháp {@link
android.view.View.OnCreateContextMenuListener#onCreateContextMenu onCreateContextMenu()}
trong {@link android.app.Activity} hoc {@link android.app.Fragment} ca bn.
<p>Khi dng xem được đăng ký nhn được mt s kin nhp giữ, h thng s gi phương pháp {@link
android.view.View.OnCreateContextMenuListener#onCreateContextMenu onCreateContextMenu()}
ca bn. Đây là nơi bn định nghĩa các mc menu, thường bng cách bung mt tài nguyên menu. Ví
dụ:</p>
<pre>
&#64;Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
</pre>
<p>{@link android.view.MenuInflater} cho phép bn bung menu ng cnh t mt <a href="{@docRoot}guide/topics/resources/menu-resource.html">tài nguyên menu</a>. Các tham s ca phương pháp gi li
bao gm {@link android.view.View}
mà người dùng đã chn và mt đối tượng {@link android.view.ContextMenu.ContextMenuInfo} cung cp
thông tin b sung v mc được chn. Nếu hot động ca bn có mt vài dng xem mà mi dng cung cp
mt menu ng cnh khác nhau, bn có th s dng nhng tham s này để xác định menu ng cnh nào cn
bung.</p>
</li>
<li>Trin khai {@link android.app.Activity#onContextItemSelected(MenuItem)
onContextItemSelected()}.
<p>Khi người dùng chn mt mc menu, h thng s gi phương pháp này để bn có th thc hin
hành động phù hp. Ví dụ:</p>
<pre>
&#64;Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit:
editNote(info.id);
return true;
case R.id.delete:
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
</pre>
<p>Phương pháp {@link android.view.MenuItem#getItemId()} sẽ truy vấn ID cho
mc menu được chn, bn nên gán mc này cho tng mc menu trong XML bng cách s dng thuc tính {@code
android:id} như trình bày trong phn v <a href="#xml">Định nghĩa mt Menu trong
XML</a>.</p>
<p>Khi bn x lý thành công mt mc menu, tr v {@code true}. Nếu bn không x lý mc menu,
bn nên chuyn mc menu đó ti trin khai siêu lp. Nếu hot động ca bn bao gm nhiu phân đon,
hot động s nhn được lnh gi li này trước. Bng cách gi siêu lp khi chưa được x lý, h thng
s chuyn s kin ti phương pháp gi li tương ng trong tng phân đon, ln lượt (theo th t
thêm phân đon) ti khi {@code true} hoc {@code false} được tr về. (Trin khai
mc định cho {@link android.app.Activity} và {@code android.app.Fragment} s tr v {@code
false}, vì thế bn nên luôn gi siêu lp khi chưa được x lý.)</p>
</li>
</ol>
<h3 id="CAB">S dng chế độ hành động theo ng cnh</h3>
<p>Chế độ hành động theo ng cnh là mt trin khai h thng {@link android.view.ActionMode}
tp trung vào tương tác người dùng hướng ti vic thc hin các hành động theo ng cnh. Khi mt
người dùng kích hot chế độ này bng cách chn mt mc, mt <em>thanh hành động ng cnh</em> s xut hin bên trên
màn hình để trình bày các hành động mà người dùng có th thc hin trên (các) mc đang được chn. Trong khi
chế độ này được kích hot, người dùng có th chn nhiu mc (nếu bn cho phép), b chn mc, và tiếp tc
điu hướng trong hot động (min là bn sn lòng cho phép). Chế độ hành động b vô hiu hóa
và thanh hành động ng cnh biến mt khi người dùng b chn tt c các mc, nhn nút QUAY LI,
hoc chn hành động <em>Xong</em> ở phía bên trái của thanh.</p>
<p class="note"><strong>Lưu ý:</strong> Thanh hành động ng cnh không nht thiết
phi được liên kết vi <a href="{@docRoot}guide/topics/ui/actionbar.html">thanh hành động</a>. Chúng vn hành
độc lp, mc dù thanh hành động ng cnh đè lên v trí ca thanh hành động
v mt hin thị.</p>
<p>Nếu bn đang phát trin cho phiên bn Android 3.0 (API mc 11) hoc cao hơn, bn
nên s dng chế độ hành động theo ng cnh để trình bày các hành động ng cnh, thay vì s dng <a href="#FloatingContextMenu">menu ng cnh ni</a>.</p>
<p>Đối vi các dng xem cung cp hành động ng cnh, bn nên thường xuyên gi ra chế độ hành động theo ng cnh
khi xy ra mt trong hai s kin sau (hoc c hai):</p>
<ul>
<li>Người dùng thc hin nhp gi trên dng xem.</li>
<li>Người dùng chn mt hp kim hoc mt thành phn UI tương t trong dng xem.</li>
</ul>
<p>Cách ng dng ca bn gi ra chế độ hành động theo ng cnh và định nghĩa hành vi cho tng
hành động ph thuc vào thiết kế ca bn. Cơ bn có hai thiết kế:</p>
<ul>
<li>Đối vi các hành động ng cnh trên các dng xem riêng lẻ, tùy ý.</li>
<li>Đối vi các hành động ng cnh hàng lot trên các nhóm mc trong mt {@link
android.widget.ListView} hoc {@link android.widget.GridView} (cho phép người dùng chn nhiu
mc và thc hin mt hành động trên tt cả).</li>
</ul>
<p>Các phn sau mô t phn thiết lp cn thiết đối vi tng kch bn.</p>
<h4 id="CABforViews">Kích hot chế độ hành động theo ng cnh cho các dng xem riêng lẻ</h4>
<p>Nếu mun gi ra chế độ hành động theo ng cnh ch khi người dùng chn các dng xem
c thể, bn nên:</p>
<ol>
<li>Trin khai giao din {@link android.view.ActionMode.Callback}. Trong các phương pháp gi li ca giao din, bn
có th quy định các hành động cho thanh hành động ng cnh, hi đáp các s kin nhp trên mc hành động, và
x lý các s kin vòng đời khác đối vi chế độ hành động.</li>
<li>Gi {@link android.app.Activity#startActionMode startActionMode()} khi bạn muốn hiển thị
thanh (chng hn như khi người dùng nhp gi dng xem).</li>
</ol>
<p>Ví dụ:</p>
<ol>
<li>Trin khai giao din {@link android.view.ActionMode.Callback ActionMode.Callback}:
<pre>
private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
// Called when the action mode is created; startActionMode() was called
&#64;Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate a menu resource providing context menu items
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
return true;
}
// Called each time the action mode is shown. Always called after onCreateActionMode, but
// may be called multiple times if the mode is invalidated.
&#64;Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false; // Return false if nothing is done
}
// Called when the user selects a contextual menu item
&#64;Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_share:
shareCurrentItem();
mode.finish(); // Action picked, so close the CAB
return true;
default:
return false;
}
}
// Called when the user exits the action mode
&#64;Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
}
};
</pre>
<p>Lưu ý rng nhng phương pháp gi li s kin này hu như ging vi các phương pháp gi li đối vi <a href="#options-menu">menu tùy chn</a>, khác ch tng phương pháp cũng chuyn đối tượng {@link
android.view.ActionMode} được liên kết vi s kin đó. Bn có th s dng các API {@link
android.view.ActionMode} để thc hin nhng thay đổi khác nhau vi CAB, chng hn như sa đổi tiêu đề và
ph đề bng {@link android.view.ActionMode#setTitle setTitle()} và {@link
android.view.ActionMode#setSubtitle setSubtitle()} (hữu ích khi muốn cho biết có bao nhiêu mục
được chn).</p>
<p>Cũng lưu ý rng các b mu trên s đặt biến {@code mActionMode} là rng khi
chế độ hành động b hy. bước tiếp theo, bn s thy cách nó được khi to và vic lưu
biến thành viên trong hot động hoc phân đon ca bn có th hu ích như thế nào.</p>
</li>
<li>Gi {@link android.app.Activity#startActionMode startActionMode()} để kích hoạt chế độ hành động theo ngữ cảnh
khi phù hp, chng hn như để hi đáp li mt s kin nhp gi trên mt {@link
android.view.View}:</p>
<pre>
someView.setOnLongClickListener(new View.OnLongClickListener() {
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
if (mActionMode != null) {
return false;
}
// Start the CAB using the ActionMode.Callback defined above
mActionMode = getActivity().startActionMode(mActionModeCallback);
view.setSelected(true);
return true;
}
});
</pre>
<p>Khi bn gi {@link android.app.Activity#startActionMode startActionMode()}, hệ thống sẽ trả về
{@link android.view.ActionMode} được to. Bng cách lưu điu này trong mt biến thành viên, bn có th
thc hin thay đổi thanh hành động theo ng cnh để hi đáp nhng s kin khác. Trong mu trên,
{@link android.view.ActionMode} được s dng để đảm bo rng thc th {@link android.view.ActionMode} không
được to li nếu nó đã hin hot, bng cách kim tra xem thành viên có rng không trước khi khi động
chế độ hành động.</p>
</li>
</ol>
<h4 id="CABforListView">Kích hot hành động theo ng cnh hàng lot trong ListView hoc GridView</h4>
<p>Nếu bn có mt bộ sưu tp các mc trong mt {@link android.widget.ListView} hoc {@link
android.widget.GridView} (hoc mt phn m rng khác ca {@link android.widget.AbsListView}) và mun
cho phép người dùng thc hin các hành động hàng lot, bn nên:</p>
<ul>
<li>Trin khai giao din {@link android.widget.AbsListView.MultiChoiceModeListener} và đặt nó
cho nhóm dng xem bng {@link android.widget.AbsListView#setMultiChoiceModeListener
setMultiChoiceModeListener()}. Trong các phương pháp gi li ca trình nghe, bn có th quy định các hành động
cho thanh hành động theo ng cnh, hi đáp các s kin nhp trên các mc hành động, và x lý các phương pháp gi li khác
được kế tha t giao din {@link android.view.ActionMode.Callback}.</li>
<li>Gi {@link android.widget.AbsListView#setChoiceMode setChoiceMode()} bằng tham đối {@link
android.widget.AbsListView#CHOICE_MODE_MULTIPLE_MODAL}.</li>
</ul>
<p>Ví dụ:</p>
<pre>
ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
&#64;Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
// Here you can do something when items are selected/de-selected,
// such as update the title in the CAB
}
&#64;Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// Respond to clicks on the actions in the CAB
switch (item.getItemId()) {
case R.id.menu_delete:
deleteSelectedItems();
mode.finish(); // Action picked, so close the CAB
return true;
default:
return false;
}
}
&#64;Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate the menu for the CAB
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context, menu);
return true;
}
&#64;Override
public void onDestroyActionMode(ActionMode mode) {
// Here you can make any necessary updates to the activity when
// the CAB is removed. By default, selected items are deselected/unchecked.
}
&#64;Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// Here you can perform updates to the CAB due to
// an {@link android.view.ActionMode#invalidate} request
return false;
}
});
</pre>
<p>Vy là xong. Lúc này, khi người dùng chn mt mc bng nhp giữ, h thng s gi phương pháp {@link
android.widget.AbsListView.MultiChoiceModeListener#onCreateActionMode onCreateActionMode()}
và hin th thanh hành động theo ng cnh vi các hành động được quy định. Trong khi thanh hành động theo ng cnh
hin thị, người dùng có th chn thêm mc.</p>
<p>Trong mt s trường hp mà các hành động ng cnh cung cp các mc hành động chung, bn có th mun
thêm mt hp kim hoc mt phn t UI tương t để cho phép người dùng chn các mc, vì
h có th không phát hin được hành vi nhp giữ. Khi mt người dùng chn hp kim, bn
có th gi ra chế độ hành động theo ng cnh bng cách thiết đặt mc danh sách tương ng v trng thái
đã chn bng {@link android.widget.AbsListView#setItemChecked setItemChecked()}.</p>
<h2 id="PopupMenu">To mt Menu Bt lên</h2>
<div class="figure" style="width:220px">
<img src="{@docRoot}images/ui/popupmenu.png" alt="" />
<p><strong>Hình 4.</strong> Menu bt lên trong ng dng Gmail, được neo vào nút tràn
trên cùng bên phi.</p>
</div>
<p>{@link android.widget.PopupMenu} là mt menu mô thái được neo vào mt {@link android.view.View}.
Nó xut hin bên dưới dng xem du neo nếu có khong trng, hoc bên trên dng xem nếu không. Nó có ích cho vic:</p>
<ul>
<li>Cung cp mt menu kiu tràn cho các hành động mà <em>liên quan ti</em> ni dung c th (chng hn như tiêu đề e-mail
ca Gmail như minh ha trong hình 4).
<p class="note"><strong>Lưu ý:</strong> Nó không ging như mt menu ng cnh, vn thường
áp dng cho các hành động mà <em>nh hưởng</em> ti ni dung được chn. Đối vi nhng hành động nh hưởng ti ni dung
được chn, hãy s dng <a href="#CAB">chế độ hành động theo ng cnh</a> hoặc <a href="#FloatingContextMenu">menu ngữ cảnh nổi</a>.</p></li>
<li>Cung cp mt phn th hai ca câu lnh (chng hn như mt nút được đánh du "Thêm"
có chc năng to ra mt menu bt lên vi các tùy chn "Thêm" khác nhau).</li>
<li>Cung cp mt danh sách th xung tương t như {@link android.widget.Spinner}, nó không gi li mt
la chn liên tc.</li>
</ul>
<p class="note"><strong>Lưu ý:</strong> {@link android.widget.PopupMenu} sn có vi API
mc 11 tr lên.</p>
<p>Nếu bn định nghĩa <a href="#xml">menu ca mình trong XML</a>, sau đây là cách bạn có thể hiển thị menu bật lên:</p>
<ol>
<li>Khi to mt {@link android.widget.PopupMenu} bng hàm dng ca nó, có chc năng đưa
ng dng hin ti {@link android.content.Context} và {@link android.view.View} ti menu
mà s được neo.</li>
<li>S dng {@link android.view.MenuInflater} để bung tài nguyên menu ca bn vào đối tượng {@link
android.view.Menu} được tr v bi {@link
android.widget.PopupMenu#getMenu() PopupMenu.getMenu()}. Trên API mức 14 trở lên, bạn có thể sử dụng
{@link android.widget.PopupMenu#inflate PopupMenu.inflate()} thay thế.</li>
<li>Gi {@link android.widget.PopupMenu#show() PopupMenu.show()}.</li>
</ol>
<p>Ví dụ, sau đây là mt nút vi thuc tính {@link android.R.attr#onClick android:onClick} có chức năng
hin th mt menu bt lên:</p>
<pre>
&lt;ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_overflow_holo_dark"
android:contentDescription="@string/descr_overflow_button"
android:onClick="showPopup" />
</pre>
<p>Khi đó, hot động có th hin th menu bt lên như sau:</p>
<pre>
public void showPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.actions, popup.getMenu());
popup.show();
}
</pre>
<p>Trong API mc 14 tr lên, bn có th kết hp hai dòng có chc năng bung menu bng {@link
android.widget.PopupMenu#inflate PopupMenu.inflate()}.</p>
<p>Menu b b qua khi người dùng chn mt mc hoc chm vào bên ngoài vùng
menu. Bn có th lng nghe báo hiu s kin b bng cách s dng {@link
android.widget.PopupMenu.OnDismissListener}.</p>
<h3 id="PopupEvents">X lý s kin nhp</h3>
<p>Để thc hin mt
hành động khi người dùng chn mt mc menu, bn phi trin khai giao din {@link
android.widget.PopupMenu.OnMenuItemClickListener} và đăng ký nó vi {@link
android.widget.PopupMenu} ca mình bng cách gi {@link android.widget.PopupMenu#setOnMenuItemClickListener
setOnMenuItemclickListener()}. Khi người dùng chn mt mc, h thng s gi lnh gi li {@link
android.widget.PopupMenu.OnMenuItemClickListener#onMenuItemClick onMenuItemClick()} trong
giao din ca bn.</p>
<p>Ví dụ:</p>
<pre>
public void showMenu(View v) {
PopupMenu popup = new PopupMenu(this, v);
// This activity implements OnMenuItemClickListener
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.actions);
popup.show();
}
&#64;Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.archive:
archive(item);
return true;
case R.id.delete:
delete(item);
return true;
default:
return false;
}
}
</pre>
<h2 id="groups">To Nhóm Menu</h2>
<p>Nhóm menu là mt tp hp các mc menu chia s nhng đặc đim nht định. Vi mt nhóm, bn có th
:</p>
<ul>
<li>Hin th hoc n tt c các mc bng {@link android.view.Menu#setGroupVisible(int,boolean)
setGroupVisible()}</li>
<li>Kích hot hoc vô hiu hóa tt c các mc bng {@link android.view.Menu#setGroupEnabled(int,boolean)
setGroupEnabled()}</li>
<li>Quy định xem tt c các mc có th chn hay không bng {@link
android.view.Menu#setGroupCheckable(int,boolean,boolean) setGroupCheckable()}</li>
</ul>
<p>Bn có th to mt nhóm bng cách lng các phn t {@code &lt;item&gt;} bên trong mt phn t {@code &lt;group&gt;}
vào tài nguyên menu ca bn hoc bng cách quy định mt ID nhóm bng phương pháp {@link
android.view.Menu#add(int,int,int,int) add()}.</p>
<p>Sau đây là mt ví d v tài nguyên menu bao gm mt nhóm:</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
&lt;item android:id="@+id/menu_save"
android:icon="@drawable/menu_save"
android:title="@string/menu_save" /&gt;
&lt;!-- menu group --&gt;
&lt;group android:id="@+id/group_delete"&gt;
&lt;item android:id="@+id/menu_archive"
android:title="@string/menu_archive" /&gt;
&lt;item android:id="@+id/menu_delete"
android:title="@string/menu_delete" /&gt;
&lt;/group&gt;
&lt;/menu&gt;
</pre>
<p>Các mc nm trong nhóm xut hin cùng cp như mc đầu tiên&mdash;tt c ba mc
trong menu đều là các mc đồng cp. Tuy nhiên, bn có th sa đổi các đặc đim ca hai
mc trong nhóm bng cách tham chiếu ID nhóm và s dng các phương pháp được lit kê bên trên. H thng cũng s
không bao gi tách riêng các mc đã ghép nhóm. Ví dụ, nếu bn khai báo {@code
android:showAsAction="ifRoom"} cho tng mc, chúng s hoc đều xut hin trong thanh hành động
hoc đều xut hin trong phn tràn hành động.</p>
<h3 id="checkable">S dng mc menu có th chn</h3>
<div class="figure" style="width:200px">
<img src="{@docRoot}images/radio_buttons.png" height="333" alt="" />
<p class="img-caption"><strong>Hình 5.</strong> nh chp màn hình mt menu con vi các mc
có th chn.</p>
</div>
<p>Mt mc có th có ích như mt giao din để bt và tt các tùy chn, bng cách s dng mt hp kim cho
các tùy chn độc lp, hoc nút chn mt cho các nhóm
tùy chn loi tr ln nhau. Hình 5 minh ha mt menu con vi các mc có th chn bng các nút
chn mt.</p>
<p class="note"><strong>Lưu ý:</strong> Các mc menu trong Menu Biu tượng (t menu tùy chn) không th
hin th mt hp kim hay nút chn mt. Nếu bn chn đặt các mc trong Menu Biu tượng là có th chn,
bn phi ch định trng thái được chn bng cách tráo đổi biu tượng và/hoc văn bn
mi ln trng thái thay đổi mt cách th công.</p>
<p>Bn có th định nghĩa hành vi có th chn cho các mc menu riêng l bng cách s dng thuc tính {@code
android:checkable} trong phn t {@code &lt;item&gt;}, hoc cho toàn b nhóm vi
thuc tính {@code android:checkableBehavior} trong phn t {@code &lt;group&gt;}. Ví
dụ, tt c các mc trong nhóm menu này có th chn bng mt nút chn mt:</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;menu xmlns:android="http://schemas.android.com/apk/res/android"&gt;
&lt;group android:checkableBehavior="single"&gt;
&lt;item android:id="@+id/red"
android:title="@string/red" /&gt;
&lt;item android:id="@+id/blue"
android:title="@string/blue" /&gt;
&lt;/group&gt;
&lt;/menu&gt;
</pre>
<p>Thuc tính {@code android:checkableBehavior} chp nhn hoc:
<dl>
<dt>{@code single}</dt>
<dd>Ch chn được mt mc t nhóm (nút chn mt)</dd>
<dt>{@code all}</dt>
<dd>Có th chn được tt c các mc (hp kim)</dd>
<dt>{@code none}</dt>
<dd>Không chn được mc nào</dd>
</dl>
<p>Bn có th áp dng mt trng thái được chn mc định cho mt mc bng cách s dng thuc tính {@code android:checked} trong
phn t {@code &lt;item&gt;} và thay đổi nó trong mã bng phương pháp {@link
android.view.MenuItem#setChecked(boolean) setChecked()}.</p>
<p>Khi chn mt mc có th chn, h thng s gi phương pháp gi li mc được chn tương ng
(chng hn như {@link android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}). Chính
đây bn phi đặt trng thái ca hp kim, vì hp kim hay nút chn mt đều không
t động thay đổi trng thái ca nó. Bn có th truy vn trng thái hin ti ca mc (như trước khi
người dùng chn) bng {@link android.view.MenuItem#isChecked()} và sau đó đặt trạng thái được chọn bằng
{@link android.view.MenuItem#setChecked(boolean) setChecked()}. Ví dụ:</p>
<pre>
&#64;Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.vibrate:
case R.id.dont_vibrate:
if (item.isChecked()) item.setChecked(false);
else item.setChecked(true);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
</pre>
<p>Nếu bn không đặt trng thái được chn bng cách này, khi đó trng thái hin th ca mc (hp kim hoc
nút chn mt) s không
thay đổi khi người dùng chn nó. Khi bn đặt trng thái, hot động s gi nguyên trng thái được chn
ca mc đó để khi người dùng m menu sau, trng thái được chn mà bn đặt
s được hin thị.</p>
<p class="note"><strong>Lưu ý:</strong>
Các mc menu có th chn được ch định s dng trên mi phiên và không được lưu sau khi
ng dng b hy. Nếu bn có các cài đặt ng dng mà bn mun lưu cho người dùng,
bn nên lưu tr d liu bng cách s dng <a href="{@docRoot}guide/topics/data/data-storage.html#pref">Tùy chn dùng chung</a>.</p>
<h2 id="intents">Thêm Mc Menu da trên Ý định</h2>
<p>Đôi khi bn s mun mt mc menu khi chy mt hot động bng cách s dng mt {@link android.content.Intent}
(dù đó là mt hot động trong ng dng ca bn hay mt ng dng khác). Khi bn biết ý định mà mình
mun s dng và có mt mc menu c th s khi to ý định, bn có th thc thi ý định
bng {@link android.app.Activity#startActivity(Intent) startActivity()} trong phương pháp gọi lại
phù hp theo mc được chn (chng hn như lnh gi li {@link
android.app.Activity#onOptionsItemSelected(MenuItem) onOptionsItemSelected()}).</p>
<p>Tuy nhiên, nếu bn không chc chn rng thiết b ca người dùng
cha mt ng dng x lý ý định đó thì vic thêm mt mc menu gi nó ra có th dn đến
mc menu không hot động, do ý định có th không phân gii thành mt
hot động. Để gii quyết điu này, Android cho phép bn linh hot thêm các mc menu vào menu ca mình
khi Android tìm các hot động trên thiết b để x lý ý định ca bn.</p>
<p>Để thêm các mc menu da trên các hot động sn có mà chp nhn ý định:</p>
<ol>
<li>Định nghĩa mt
ý định bng th loi {@link android.content.Intent#CATEGORY_ALTERNATIVE} và/hoặc
{@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE}, cộng với bất kỳ yêu cầu nào khác.</li>
<li>Gi {@link
android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
Menu.addIntentOptions()}. Sau đó, Android tìm kiếm bt k ng dng nào có th thc hin ý định
và thêm chúng vào menu ca bn.</li>
</ol>
<p>Nếu không có ng dng được cài đặt
mà tha mãn ý định thì không có mc menu nào được thêm vào.</p>
<p class="note"><strong>Lưu ý:</strong>
{@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE} được sử dụng để xử lý
phn t đang được chn trên màn hình. Vì vy, nó ch nên được s dng khi to mt Menu trong {@link
android.app.Activity#onCreateContextMenu(ContextMenu,View,ContextMenuInfo)
onCreateContextMenu()}.</p>
<p>Ví dụ:</p>
<pre>
&#64;Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
// Create an Intent that describes the requirements to fulfill, to be included
// in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.
Intent intent = new Intent(null, dataUri);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
// Search and populate the menu with acceptable offering applications.
menu.addIntentOptions(
R.id.intent_group, // Menu group to which new items will be added
0, // Unique item ID (none)
0, // Order for the items (none)
this.getComponentName(), // The current activity name
null, // Specific items to place first (none)
intent, // Intent created above that describes our requirements
0, // Additional flags to control items (none)
null); // Array of MenuItems that correlate to specific items (none)
return true;
}</pre>
<p>Đối vi mi hot động được tìm thy mà cung cp mt b lc ý định khp vi ý định được định nghĩa, mt mc menu
được thêm, bng cách s dng giá tr trong <code>android:label</code> ca b lc ý định làm
tiêu đề ca mc menu và biu tượng ca ng dng làm biu tượng ca mc menu. Phương pháp
{@link android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
addIntentOptions()} tr v s mc menu được thêm.</p>
<p class="note"><strong>Lưu ý:</strong> Khi bn gi {@link
android.view.Menu#addIntentOptions(int,int,int,ComponentName,Intent[],Intent,int,MenuItem[])
addIntentOptions()}, nó s khng chế bt k và tt c các mc menu theo nhóm menu được quy định trong tham đối
đầu tiên.</p>
<h3 id="AllowingToAdd">Cho phép hot động ca bn được thêm vào các menu khác</h3>
<p>Bn cũng có th cung cp các dch v ca hot động ca mình cho các ng dng khác, vì vy ng dng ca bn
có th nm trong menu ca các ng dng khác (đảo ngược vai trò nêu trên).</p>
<p>Để được nm trong menu ca ng dng khác, bn cn định nghĩa mt b lc
ý định như bình thường, nhưng đảm bo thêm các giá tr {@link android.content.Intent#CATEGORY_ALTERNATIVE}
và/hoc {@link android.content.Intent#CATEGORY_SELECTED_ALTERNATIVE} cho thể loại
b lc ý định. Ví dụ:</p>
<pre>
&lt;intent-filter label="&#64;string/resize_image">
...
&lt;category android:name="android.intent.category.ALTERNATIVE" />
&lt;category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
...
&lt;/intent-filter>
</pre>
<p>Tìm hiu thêm v vic ghi các b lc ý định trong tài liu
<a href="/guide/components/intents-filters.html" định và B lc Ý định</a>.</p>
<p>Để tham kho mt ng dng mu s dng k thut này, hãy xem mã mu
<a href="{@docRoot}resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html">Note
Pad</a>.</p>