1. 程式人生 > 實用技巧 >吳裕雄--天生自然ANDROID開發學習:2.6.2 選單(Menu)

吳裕雄--天生自然ANDROID開發學習:2.6.2 選單(Menu)

官方文件:menus:http://androiddoc.qiniudn.com/guide/topics/ui/menus.html
1.OptionMenu(選項選單)
1)如何使用OptionMenu?
答:非常簡單,重寫兩個方法就好,其實這兩個方法我們在建立專案的時候就會自動生成~ 他們分別是:

public boolean onCreateOptionsMenu(Menu menu):呼叫OptionMenu,在這裡完成選單初始化
public boolean onOptionsItemSelected(MenuItem item):選單項被選中時觸發,這裡完成事件處理
當然除了上面這兩個方法我們可以重寫外我們還可以重寫這三個方法:

public void onOptionsMenuClosed(Menu menu):選單關閉會呼叫該方法
public boolean onPrepareOptionsMenu(Menu menu):選項選單顯示前會呼叫該方法, 可在這裡進行選單的調整(動態載入選單列表)
public boolean onMenuOpened(int featureId, Menu menu):選項選單開啟以後會呼叫這個方法
而載入選單的方式有兩種,一種是直接通過編寫選單XML檔案,然後呼叫: getMenuInflater().inflate(R.menu.menu_main, menu);載入選單 或者通過程式碼動態新增,onCreateOptionsMenu的引數menu,呼叫add方法新增 選單,add(選單項的組號,ID,排序號,標題),另外如果排序號是按新增順序排序的話都填0即可

程式碼實現:

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    //1.定義不同顏色的選單項的標識:
    final private int RED = 110;
    final private int GREEN = 111;
    final private int BLUE = 112;
    final private int YELLOW = 113;
    final private int GRAY= 114;
    final private int CYAN= 115;
    final private int BLACK= 116;

    private TextView tv_test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_test = (TextView) findViewById(R.id.tv_test);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        menu.add(1,RED,4,"紅色");
        menu.add(1,GREEN,2,"綠色");
        menu.add(1,BLUE,3,"藍色");
        menu.add(1,YELLOW,1,"黃色");
        menu.add(1,GRAY,5,"灰色");
        menu.add(1,CYAN,6,"藍綠色");
        menu.add(1,BLACK,7,"黑色");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        switch (id){
            case RED:
                tv_test.setTextColor(Color.RED);
                break;
            case GREEN:
                tv_test.setTextColor(Color.GREEN);
                break;
            case BLUE:
                tv_test.setTextColor(Color.BLUE);
                break;
            case YELLOW:
                tv_test.setTextColor(Color.YELLOW);
                break;
            case GRAY:
                tv_test.setTextColor(Color.GRAY);
                break;
            case CYAN:
                tv_test.setTextColor(Color.CYAN);
                break;
            case BLACK:
                tv_test.setTextColor(Color.BLACK);
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

另外通過XML方式定義Menu的方式,貼個簡單的參考程式碼:

<?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="@string/new_game"
          android:showAsAction="ifRoom"/>
    <item android:id="@+id/help"
          android:icon="@drawable/ic_help"
          android:title="@string/help" />
</menu>
1)如何使用ContextMenu?
答:使用的流程如下:

Step 1:重寫onCreateContextMenu()方法
Step 2:為view元件註冊上下文選單,使用registerForContextMenu()方法,引數是View
Step 3:重寫onContextItemSelected()方法為選單項指定事件監聽器

實現程式碼:

我們先來編寫選項選單的選單XML檔案:

menu_context.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 定義一組單選按鈕 -->
    <!-- checkableBehavior的可選值由三個:single設定為單選,all為多選,none為普通選項 -->
    <group android:checkableBehavior="none">
        <item android:id="@+id/blue" android:title="@string/font_blue"/>
        <item android:id="@+id/green" android:title="@string/font_green"/>
        <item android:id="@+id/red" android:title="@string/font_red"/>
    </group>
</menu>
接著我們在選項選單的那個基礎上,新增一個TextView,然後加上下面一些東西:

private TextView tv_context;
tv_context = (TextView) findViewById(R.id.tv_context);
        registerForContextMenu(tv_context);

    //重寫與ContextMenu相關方法
    @Override
    //重寫上下文選單的建立方法
    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.menu_context, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    //上下文選單被點選是觸發該方法
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.blue:
                tv_context.setTextColor(Color.BLUE);
                break;
            case R.id.green:
                tv_context.setTextColor(Color.GREEN);
                break;
            case R.id.red:
                tv_context.setTextColor(Color.RED);
                break;
        }
        return true;
    }
3.SubMenu(子選單)
所謂的子菜單只是在<**item**>中又嵌套了一層<**menu**>而已
實現程式碼:

編寫子選單的Menu檔案:menu_sub.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/submenu" android:title="子選單使用演示~">
        <menu>
            <group android:checkableBehavior = "none">
                <item android:id="@+id/one" android:title = "子選單一"/>
                <item android:id="@+id/two" android:title = "子選單二"/>
                <item android:id="@+id/three" android:title = "子選單三"/>
            </group>
        </menu>
    </item>
</menu>
接著我們改下上面上下文選單的兩個方法的內容,換上下面的程式碼:

public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenu.ContextMenuInfo menuInfo) {
        //子選單部分:
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.menu_sub, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
}

public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
            case R.id.one:
                Toast.makeText(MainActivity.this,"你點選了子選單一",Toast.LENGTH_SHORT).show();
                break;
            case R.id.two:
                item.setCheckable(true);
                Toast.makeText(MainActivity.this,"你點選了子選單二",Toast.LENGTH_SHORT).show();
                break;
            case R.id.three:
                Toast.makeText(MainActivity.this,"你點選了子選單三",Toast.LENGTH_SHORT).show();
                item.setCheckable(true);
                break;
        }
    return true;
}
4.PopupMenu(彈出式選單)
一個類似於PopupWindow的東東,他可以很方便的在指定View下顯示一個彈出選單,而且 他的選單選項可以來自於Menu資源

實現程式碼:

選單資原始檔:menu_pop.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/lpig" android:title="小豬" />
    <item android:id="@+id/bpig" android:title="大豬" />
</menu>
在佈局中新增一個按鈕,然後新增點選事件:

MainActivity.java:

btn_show_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popup = new PopupMenu(MainActivity.this,btn_show_menu);
                popup.getMenuInflater().inflate(R.menu.menu_pop, popup.getMenu());
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()){
                            case R.id.lpig:
                                Toast.makeText(MainActivity.this,"你點了小豬~",
                                Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.bpig:
                                Toast.makeText(MainActivity.this,"你點了大豬~",
                                Toast.LENGTH_SHORT).show();
                                break;
                        }
                        return true;
                    }
                });
                popup.show();
            }
        });