第十章 頁面選單

      在〈第十章 頁面選單〉中尚無留言

頁面選單又分為Option Menu(選項選單) 及Context Menu(本文選單)

Option Menu

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

android_menu_1

android_menu_2

要顯示此選單, 需覆寫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()方法

android_context_menu

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();

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *