頁面選單又分為Option Menu(選項選單) 及Context Menu(本文選單)
Option Menu
一般應用程式皆會在畫面的右上方設定一個menu選單, 用來提供不常用的功能, 比如設定, 或是關於(顯示本應用程式的資訊).


要顯示此選單, 需覆寫Activity裏的 public boolean onCreateOptionsMenu(Menu menu) 方法, 在此方法中設定要顯示的項目.
而要顯示的項目, 可以在res/menu目錄中先設定好, 底下為res/menu/main.xml的內容
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:title="搜尋"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="always"/>
<item
android:id="@+id/setting"
android:title="設定"
app:showAsAction="never"/>
<item
android:id="@+id/about"
android:title="關於"
app:showAsAction="never"/>
</menu>
menu資源檔, 必需包含在 <menu>標簽中, 每一個選項都是一個<item>標簽. 每個item都可以設定id, title, icon, onClick
app:showAsAction=”never”是用來設定選單顯示的方式, 有如下的方式可用
never : 一般形式的下拉式選單
always : 永遠會出現在橫列的選單上
ifRoom : 有空間才顯示
onCreateOptionsMenu覆寫方法, 先取得MenuInflater物件, 再用此物件的inflate()方法, 設定資源檔的選單, 如下程式碼所式
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0,1,0,"新增");//參數1:群組id, 參數2:itemId, 參數3:item順序, 參數4:item名稱
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.main, menu);
return true;
}
當使用者按下選單後, 要執行的任務, 除了可在android:onClick中指定外, 另外也可以覆寫onOptionsItemSelected(MenuItem item)方法, 利用item.getItemId()判斷是那一個選單被按下. 程式碼如下
public boolean onOptionsItemSelected(MenuItem item) { int id=item.getItemId(); switch(id){ case R.id.search: break; case R.id.setting: break; case R.id.about: break; } return super.onOptionsItemSelected(item); }
Context Menu
在畫面元件中, 使用者長按後, 會彈出一個浮動視窗, 此視窗稱為本文視窗. 以ListView為例, 長按後可以選擇刪除或新增的功能. 使用此功能, 一樣先準備menu.xml的選單, 然後於Activity中使用registerForContextMenu註冊要長按的功能. 然後再覆寫onCreateContextMenu()及onContextItemSelected()方法

list_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/add"
android:titld="新增" />
<item
android:id="@+id/delete"
android:title="刪除" />
<item
android:id="@+id/reflesh"
android:title="重新整理" />
</menu>
Java程式碼
public class MainActivity extends AppCompatActivity {
ArrayAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter= ArrayAdapter.createFromResource(this,R.array.planet, android.R.layout.simple_list_item_1);
ListView listView=(ListView)findViewById(R.id.listView);
listView.setAdapter(adapter);
registerForContextMenu(listView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater=getMenuInflater();
inflater.inflate(R.menu.list_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info=
(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
switch(item.getItemId()){
case R.id.add:
Toast.makeText(this, "新增", Toast.LENGTH_LONG).show();
break;
case R.id.delete:
String str=(String)adapter.getItem(info.position);
Toast.makeText(this,str, Toast.LENGTH_LONG).show();
break;
case R.id.reflesh:
break;
}
return super.onContextItemSelected(item);
}
}
上述程式碼, 使用如下方式取得ListView中是那一個項目被按下
AdapterContextMenuInfo info=(AdapterContextMenuInfo)item.getMenuInfo();
