Android菜單設計(1) : 使用xml文件佈局創建 options menu – Android移動開發技術文章_手機開發 Android移動開發教學課程

1. 準備工作


 


下載幾張圖片,為menu錦上添花 


2. 新建android項目


 


在項目的res文件下面建立一個名稱為menu的文件夾,用來放置xml文件。即menu的佈局文件。


 


目錄結構如下,所示:


 


 


 


game_menu.xml源碼:


view plain
<?xml version=”1.0″ encoding=”utf-8″?> 
<menu xmlns:android=”http://schemas.android.com/apk/res/android”> 
    <item android:id=”@+id/new_game” 
          android:icon=”@drawable/ic_new_game” 
          android:title=”new_game” /> 
           
    <item android:id=”@+id/help” 
          android:icon=”@drawable/ic_help” 
          android:title=”help” /> 
</menu> 
 


update_menu.xml源碼:


view plain
<?xml version=”1.0″ encoding=”utf-8″?> 
<menu xmlns:android=”http://schemas.android.com/apk/res/android”> 
    <item android:id=”@+id/new_game” 
          android:icon=”@drawable/back_game” 
          android:title=”exit” /> 
           
    <item android:id=”@+id/help” 
          android:icon=”@drawable/exit_game” 
          android:title=”back” /> 
</menu> 
 


3. 創建菜單


 


重寫 onCreateOptionsMenu(Menu menu) 方法即可。


view plain
@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        Log.d(TAG, “onCreateOptionsMenu() is involed! ” + (times++) + ” th”); 
        MenuInflater mInflater = getMenuInflater(); 
        mInflater.inflate(R.menu.game_menu, menu); 
        // 等效下面代碼 
        //return super.onCreateOptionsMenu(menu); 
        return true;// 返回false就不會顯示菜單 
    } 
 


ok,運行程序,點擊”menu”,顯示效果如下:


 


 


 


4. 為菜單設計點擊事件


 


重寫 onOptionsItemSelected(MenuItem item) 方法即可!


view plain
@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); 
        } 
    } 
 


5. 動態改變menu


 


onCreateOptionsMenu(Menu menu) 方法隻會在App運行時被調用一次,相當於Activity 的 onCreate( ) 方法類似。如果想動態改變menu,需要重寫 onPrepareOptionsMenu(Menu menu) 方法。


view plain
@Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
        Log.d(TAG, “onPrepareOptionsMenu() is involed! ” + (times++) + ” th”); 
        MenuInflater mInflater = getMenuInflater(); 
        mInflater.inflate(R.menu.update_menu, menu); 
        // 等效下面代碼 
        //return super.onPrepareOptionsMenu(menu); 
        return true;// 返回false就不會顯示菜單 
    } 
 


顯示效果,如下所示:


 


 


 


看看,log日志吧??!!!


 


 


 


ok,至此你明白瞭,onPrepareOptionsMenu(Menu menu) 方法在 onCreateOptionsMenu(Menu menu) 方法之後被調用,接著我們再次點擊menu,多點擊幾次。效果和Log日志,如下所示。


 


 


 


 


 


可以發現,onPrepareOptionsMenu(Menu menu) 方法每次點擊 menu 都會被調用一次。如果,在實際代碼中這樣做的話,會產生很多menu項,顯然不可以,那怎麼辦呢?很簡單,看示例代碼如下:


view plain
@Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
        Log.d(TAG, “onPrepareOptionsMenu() is involed! ” + (times++) + ” th”); 
        // 清除menu 
        menu.clear(); 
        MenuInflater mInflater = getMenuInflater(); 
        mInflater.inflate(R.menu.update_menu, menu); 
        // 等效下面代碼 
        //return super.onPrepareOptionsMenu(menu); 
        return true;// 返回false就不會顯示菜單 
    } 
 


這樣的話,原先在 onCreateOptionsMenu(Menu menu) 方法中創建的菜單就會煙消雲散,呵呵,效果圖:


 


 


 


6. 提示


 


在最後,用sdk的api文檔上面的原文做個提示:


view plain
On Android 2.3 and lower, the system calls onPrepareOptionsMenu() each time the user opens the Options Menu. 
On Android 3.0 and higher, you must call invalidateOptionsMenu() when you want to update the

發佈留言

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