頁面選單又分為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();