周六日休息,有點懈怠了,沒有學習,補充元氣,繼續努力,加油(*^__^*) !
要學習菜單,我們需要Crowdsourced Security Testing道什麼是菜單,來看一下~
開啟模擬器或者手機,點擊menu鍵,標誌位置即為菜單
,Android的選項菜單是預設不見的,當使用者按下Menu鍵時程式菜單將會出現在螢幕下方。Android系統預設最多隻有6個菜單位,如果超過6個菜單,系統將會在第6個菜單位顯示“更多”。
,Android系統的菜單注意通過4個介面來體現
圖畫得不好,大家主要看意思啊~
Menu介面是個父介面,介面下有兩個子介面。
Submenu:它代表了一個子功能表,它可以包含多個MenuItem(形成功能表項目)。
ContextMenu:它代表一個操作功能表。它也可以包含多個MenuItem。
Menu定義了如下方法來添加菜單和功能表項目。
MenuItem add(int titleRes)添加一個新的功能表項目。
MenuItem add(int groupId,int itemId,int order,CharSequence title)添加一個新的處於groupId組的功能表項目
MenuItem add(int groupId,int itemId,int order,int titleRes)添加一個新的處於groupId組的功能表項目
MenuItem add(CharSequence title)添加一個新的功能表項目
SubMenu addSubMenu(int titleRes)添加一個新的子功能表
SubMenu addSubMenu(int groupId,int itemId,int order,int titleRes)添加一個新的處於groupId組的子功能表
綜述:add方法用於添加功能表項目,addSubMenu用於添加子功能表,這些重載方法的區別是:是否將子功能表,功能表項目添加到指定菜單中,是否使用資源檔中的字串資源來設定標題。
下面我們看一下Android程式中如何添加菜單和子功能表
我想要實現一個這樣的效果,在Activity中添加一個EditText,我通過下方的Menu菜單和子功能表,完成更改字型顏色和大小的功能。
好,現在我們可以看到,要實現這種效果,我們需要添加3個功能表項目,在字型功能表項目中我們需要添加5個子功能表項,在顏色功能表項目中我們需要添加3個子功能表項,下面我們開始寫代碼。
我們需要做的第一步:重寫Activity中的onCreateOptionsMenu(Menu menu)的方法,在該方法裡調用Menu對象的方法來添加功能表項目或子功能表
第二步:如果希望程式能響應功能表項目的點擊事件,重寫Activity的onOptionsItemSelected(MenuItem mi)方法即可。
這個程式的布局檔案,只是在Activity中添加了一個EditText,這裡就不做展示了
Java代碼:
package song.activity;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.SubMenu;import android.widget.EditText;import android.widget.Toast;public class MenuTestActivity extends Activity{// 定義字型大小功能表項目的標識final int FONT_10 = 0x111;final int FONT_12 = 0x112;final int FONT_14 = 0x113;final int FONT_16 = 0x114;final int FONT_18 = 0x115;// 定義普通功能表項目的標識final int PLAIN_ITEM = 0x11b;// 定義字型顏色功能表項目的標識final int FONT_RED = 0x116;final int FONT_BLUE = 0x117;final int FONT_GREEN = 0x118;private EditText edit;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);edit = (EditText) findViewById(R.id.txt);}@Overridepublic boolean onCreateOptionsMenu(Menu menu){// -------------向menu中添加字型大小的子功能表-------------SubMenu fontMenu = menu.addSubMenu("字型大小");// 設定菜單的表徵圖fontMenu.setIcon(R.drawable.font);// 設定菜單頭的表徵圖fontMenu.setHeaderIcon(R.drawable.font);// 設定菜單頭的標題fontMenu.setHeaderTitle("選擇字型大小");fontMenu.add(0, FONT_10, 0, "10號字型");fontMenu.add(0, FONT_12, 0, "12號字型");fontMenu.add(0, FONT_14, 0, "14號字型");fontMenu.add(0, FONT_16, 0, "16號字型");fontMenu.add(0, FONT_18, 0, "18號字型");// -------------向menu中添加普通功能表項目-------------menu.add(0, PLAIN_ITEM, 0, "普通功能表項目");// -------------向menu中添加文字顏色的子功能表-------------SubMenu colorMenu = menu.addSubMenu("字型顏色");colorMenu.setIcon(R.drawable.color);// 設定菜單頭的表徵圖colorMenu.setHeaderIcon(R.drawable.color);// 設定菜單頭的標題colorMenu.setHeaderTitle("選擇文字顏色");colorMenu.add(0, FONT_RED, 0, "紅色");colorMenu.add(0, FONT_GREEN, 0, "綠色");colorMenu.add(0, FONT_BLUE, 0, "藍色");return super.onCreateOptionsMenu(menu);}@Override// 功能表項目被單擊後的回調方法public boolean onOptionsItemSelected(MenuItem mi){//判斷單擊的是哪個功能表項目,並針對性的作出響應。switch (mi.getItemId()){case FONT_10:edit.setTextSize(10 * 2);break;case FONT_12:edit.setTextSize(12 * 2);break;case FONT_14:edit.setTextSize(14 * 2);break;case FONT_16:edit.setTextSize(16 * 2);break;case FONT_18:edit.setTextSize(18 * 2);break;case FONT_RED:edit.setTextColor(Color.RED);break;case FONT_GREEN:edit.setTextColor(Color.GREEN);break;case FONT_BLUE:edit.setTextColor(Color.BLUE);break;case PLAIN_ITEM:Toast toast = Toast.makeText(MenuTestActivity.this, "您單擊了普通功能表項目" , Toast.LENGTH_SHORT);toast.show();break;}return true;}}
,大家看到我所有的代碼都是在Java中完成的,那麼如何利用xml定義選項菜單呢?
android.view.MenuInflater
This class is used to instantiate menu XML files into Menu objects.這個類被用來使菜單xml檔案執行個體化為菜單對象
首先我們建立一個menu檔案夾,在其中建立一個option_menu.xml檔案,檔案內容如下
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/font" android:icon="@drawable/font" android:title="設定字型大小" android:titleCondensed="字型大小"> <menu > <item android:id="@+id/FONT_10" android:title="10號字型" /> <item android:id="@+id/FONT_12" android:title="12號字型" /> <item android:id="@+id/FONT_14" android:title="14號字型" /> <item android:id="@+id/FONT_16" android:title="16號字型" /> <item android:id="@+id/FONT_18" android:title="18號字型" /> </menu></item><item android:id="@+id/normal" android:title="普通功能表項目"/> <item android:id="@+id/color" android:icon="@drawable/color" android:title="字型顏色"> <menu> <item android:id="@+id/FONT_RED" android:title="紅色" /> <item android:id="@+id/FONT_GREEN" android:title="黃色" /> <item android:id="@+id/FONT_BLUE" android:title="綠色" /> </menu></item> </menu>
Activity的Java檔案:
package song.activity;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.Menu;import android.view.MenuInflater;import android.view.MenuItem;import android.view.MenuItem.OnMenuItemClickListener;import android.view.SubMenu;import android.widget.EditText;import android.widget.Toast;public class MenuTestActivity extends Activity implements OnMenuItemClickListener{private EditText edit;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);edit = (EditText) findViewById(R.id.txt);}@Overridepublic boolean onCreateOptionsMenu(Menu menu){MenuInflater inflater = this.getMenuInflater(); inflater.inflate(R.menu.option_menu, menu); for(int i=0; i<menu.size(); i++){ menu.getItem(i).setOnMenuItemClickListener(this); } SubMenu smenu1 = menu.findItem(R.id.font).getSubMenu(); for(int i=0; i<smenu1.size(); i++){ smenu1.getItem(i).setOnMenuItemClickListener(this); } SubMenu smenu2 = menu.findItem(R.id.color).getSubMenu(); for(int i=0; i<smenu2.size(); i++){ smenu2.getItem(i).setOnMenuItemClickListener(this); } return true;}@Overridepublic boolean onMenuItemClick(MenuItem mi) {//判斷單擊的是哪個功能表項目,並針對性的作出響應。switch (mi.getItemId()){case R.id.FONT_10:edit.setTextSize(10 * 2);break;case R.id.FONT_12:edit.setTextSize(12 * 2);break;case R.id.FONT_14:edit.setTextSize(14 * 2);break;case R.id.FONT_16:edit.setTextSize(16 * 2);break;case R.id.FONT_18:edit.setTextSize(18 * 2);break;case R.id.FONT_RED:edit.setTextColor(Color.RED);break;case R.id.FONT_GREEN:edit.setTextColor(Color.GREEN);break;case R.id.FONT_BLUE:edit.setTextColor(Color.BLUE);break;case R.id.normal:Toast toast = Toast.makeText(MenuTestActivity.this, "您單擊了普通功能表項目" , Toast.LENGTH_SHORT);toast.show();break;}return true;}}
其中
public boolean onCreateOptionsMenu(Menu menu){MenuInflater inflater = this.getMenuInflater(); inflater.inflate(R.menu.option_menu, menu); for(int i=0; i<menu.size(); i++){ menu.getItem(i).setOnMenuItemClickListener(this); } SubMenu smenu1 = menu.findItem(R.id.font).getSubMenu(); for(int i=0; i<smenu1.size(); i++){ smenu1.getItem(i).setOnMenuItemClickListener(this); } SubMenu smenu2 = menu.findItem(R.id.color).getSubMenu(); for(int i=0; i<smenu2.size(); i++){ smenu2.getItem(i).setOnMenuItemClickListener(this); } return true;}
為將xml檔案轉化的代碼