Android APK開發:Menu介面功能詳解

guocctjpu發表於2020-10-27


    最近開發一個APK專案,用到了menu選單,並要求其中的一個item標識是否連線藍芽。思路很簡單,用一個全域性靜態變數來標識藍芽連線狀態,並在更新選單時判斷這個變數,然後選擇不同處理方式,即顯示不同的圖片。
    本文的初衷是對Android的menu功能作總結,所以並不會一步步的教大家去實現上文論述的功能,這裡僅對menu涉及的幾個介面做描述。

1、onCreateOptionsMenu

public boolean onCreateOptionsMenu(Menu menu)
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    //R.menu.main就是想要載入的Menu選單,是一個xml檔案,一般放在res/Menu下
    getMenuInflater().inflate(R.menu.main, menu);
    super.onPrepareOptionsMenu(menu);
    //這裡直接讓顯示了
    return true;
}

    回撥函式,在第一次初始化選單的時候呼叫,其中menu引數就是即將要顯示的Menu例項。

2、onPrepareOptionsMenu

public boolean onPrepareOptionsMenu(Menu menu)
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (UART_STATE) {
        //bluetooth_status是選單項的ID,是需要動態更新的,這裡根據全域性變數UART_START設定了不同的圖片
        menu.findItem(R.id.bluetooth_status).setIcon(R.drawable.actionbar_statuson_icon);
    } else {
Log.e(TAG, "onPrepareOptionsMenu: false");
        menu.findItem(R.id.bluetooth_status).setIcon(R.drawable.actionbar_status_icon);
    }
    return super.onPrepareOptionsMenu(menu);
}

    回撥函式,此方法在onCreateOptionsMenu之後,在選單顯示之前被呼叫。可以通過此方法動態的改變選單的狀態。(上文中對藍芽連線狀態的判斷就是在這裡處理的,對Menuitem做了更改填充圖片的操作)。

3、onOptionsItemSelected

public boolean onOptionsItemSelected(MenuItem item)
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
    switch (menuItem.getItemId()) {
    	//當點選選單項R.id.bluetooth_status時,程式碼會回撥到這裡
        case R.id.bluetooth_status:
            ...;
        break;
    }
}

    回撥函式,對選單項的監聽。這個介面傳入的引數和前面兩個的不一樣,傳入的是MenuItem,通過它可以獲得被點選的選單項的id。類似的,也就可以像Button點選時間一樣做對應處理。

4、invalidateOptionsMenu

  public void invalidateOptionsMenu()

    用於將現有的選單無效,然後系統會重新呼叫onPrepareOptionsMenu(),為開發者提供一個介面手動更新選單。需要更新時直接呼叫即可。

5、介面1和介面2的區別

    介面1僅僅在activity建立的時候呼叫一次。介面2會在點選menu鍵被呼叫,也就是可以被多次呼叫,所以在介面2可以對選單狀態做動態更新。

6、版本問題(轉載,未做驗證)

    Android2.3或更低的版本會在每次Menu開啟的時候呼叫一次onPrepareOptionsMenu()。
    Android3.0及以上版本預設menu是開啟的,所以必須呼叫invalidateOptionsMenu()方法,然後系統將呼叫onPrepareOptionsMenu()執行update操作。

    一般使用menu會用到1、3介面,在程式碼中重寫,相互配合就可以實現一個簡單的選單,包括選單顯示和點選響應。但是如果需要根據情況動態更新menu,則會用到2、4。差不多就介紹到這裡吧,重要程式碼都已經放在介面介紹後面,為大家作參考,自己有時間也會做一個Demo出來,後續也會更新。

    雖然又做了一次搬用工,但是希望對自己有用,最好也能幫助到你+_+。
參考網址:
https://blog.csdn.net/zzq123686/article/details/52448412
https://blog.csdn.net/yiding_he/article/details/38410151

相關文章