在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ 第十九章-Android菜單之選項(xiàng)菜單
第十八章-ViewPager+FragmentStatePagerAdapter實(shí)現(xiàn)仿微信Tab
第十五章-GridView實(shí)現(xiàn)動(dòng)態(tài)添加和刪除子項(xiàng)
第九章-進(jìn)度條ProgressBar
第十二章-經(jīng)典的ListView
第十四章-GridView控件
第八章-時(shí)間相關(guān)控件
第七章-下拉框Spinner控件
第二章-EditText探秘
第二十章-Android菜單之上下文菜單
第十一章-各種對(duì)話框Dialog集錦
第二十一章-Android菜單之子菜單
第六章-切換類TextSwitcher和ImageSwitcher
第十七章-ViewPager切換界面
第五章-開關(guān)按鈕ToggleButton和Switch
第二十二章-PopupWindow浮動(dòng)窗
第十六章-幻燈片ViewFlipper
第二十四章-RecyclerView動(dòng)態(tài)添加、刪除及點(diǎn)擊事件
第三章-交互之王Button控件
第二十三章-全新控件RecyclerView
第一章-好玩的TextView
第十三章-ListView擴(kuò)展(多選、全選、反選)
第四章-玩轉(zhuǎn)單選和多選按鈕
第十章-可以拖動(dòng)的ProgressBar-SeekBar
第十九章-Android菜單之選項(xiàng)菜單

第十九章-Android菜單之選項(xiàng)菜單

Android菜單包括選項(xiàng)菜單(OptionsMenu)、上下文菜單(ContextMenu)和子菜單(SubMenu)三種,本節(jié)將對(duì)這選項(xiàng)菜單的用法進(jìn)行學(xué)習(xí)。

選項(xiàng)菜單共有五個(gè)常用的方法,下面對(duì)這些方法進(jìn)行一一介紹:

  • public boolean onCreateOptionsMenu(Menu menu):使用此方法創(chuàng)建選項(xiàng)菜單,通常有兩種方式,一種稱為靜態(tài)方式(xml布局文件創(chuàng)建菜單),另一種通過Menu的add方法動(dòng)態(tài)添加選項(xiàng)菜單;
  • public boolean onOptionsItemSelected(MenuItem item):選中菜單項(xiàng)被選擇后觸發(fā),可以根據(jù)item對(duì)象的getItemId方法判斷點(diǎn)擊了哪一個(gè)菜單;
  • public void onOptionsMenuClosed(Menu menu):菜單關(guān)閉時(shí)觸發(fā);
  • public boolean onPrepareOptionsMenu(Menu menu):選項(xiàng)菜單顯示之前觸發(fā);
  • public boolean onMenuOpened(int featureId, Menu menu):選項(xiàng)菜單打開時(shí)觸發(fā)。

下面通過靜態(tài)和動(dòng)態(tài)的方式構(gòu)建選項(xiàng)菜單

1.靜態(tài)方式:通過定義xml文件的形式確定子項(xiàng)菜單 菜單文件(menu.xml)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/meun1"
        android:icon="@mipmap/ic_launcher"
        android:orderInCategory="3"
        android:title="菜單一" />
    <item
        android:id="@+id/menu2"
        android:orderInCategory="2"
        android:title="菜單二" />
    <item
        android:id="@+id/menu3"
        android:enabled="false"
        android:orderInCategory="4"
        android:title="不可用菜單" />
</menu>

這里定義了三個(gè)item,每個(gè)item都有特定的屬性,下面總結(jié)一下常用屬性含義:

http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-1.png" alt="這里寫圖片描述" />

MainActivity代碼(MainActivity.java)

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu,menu);
        return true;
    }
   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.meun1:
                Toast.makeText(MainActivity.this, "菜單一被選擇了", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu2:
                Toast.makeText(MainActivity.this, "菜單二被選擇了", Toast.LENGTH_SHORT).show();
                break;
            case R.id.menu3:
                Toast.makeText(MainActivity.this, "菜單三被選擇了", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {
        Toast.makeText(MainActivity.this, "選項(xiàng)菜單開啟", Toast.LENGTH_SHORT).show();
        return super.onMenuOpened(featureId, menu);
    }
    @Override
    public void onOptionsMenuClosed(Menu menu) {
        super.onOptionsMenuClosed(menu);
        Toast.makeText(MainActivity.this, "選項(xiàng)菜單關(guān)閉", Toast.LENGTH_SHORT).show();
    }
}

這里使用了getMenuInflater().inflate(R.menu.menu,menu);方式導(dǎo)入菜單文件,inflate方法需要傳入兩個(gè)參數(shù),第一個(gè)是菜單文件,第二個(gè)是Menu對(duì)象。同時(shí)也調(diào)用了onOptionsItemSelected方法監(jiān)聽菜單項(xiàng)的選擇,調(diào)用了onMenuOpened和onOptionMenuClosed方法監(jiān)聽菜單選項(xiàng)的打開和關(guān)閉。

運(yùn)行項(xiàng)目實(shí)例:

http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-2.png" alt="這里寫圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-3.png" alt="這里寫圖片描述" />

我們?cè)趍enu文件中設(shè)置了第三個(gè)菜單的enable為false,所以它不可點(diǎn)擊。

2.動(dòng)態(tài)方式

MainActivity(MainActivity.java)

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {//創(chuàng)建選項(xiàng)菜單
        menu.add(menu.NONE, 1, 1, "菜單1");
        menu.add(menu.NONE, 2, 2, "菜單2");
        menu.add(menu.NONE, 3, 3, "菜單3");
        menu.add(menu.NONE, 4, 4, "菜單4");
        return super.onCreateOptionsMenu(menu);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {//菜單選擇監(jiān)聽
        switch (item.getItemId()) {
            case 1:
                Toast.makeText(MainActivity.this, "菜單一被選擇了", Toast.LENGTH_SHORT).show();
                break;
            case 2:
                Toast.makeText(MainActivity.this, "菜單二被選擇了", Toast.LENGTH_SHORT).show();
                break;
            case 3:
                Toast.makeText(MainActivity.this, "菜單三被選擇了", Toast.LENGTH_SHORT).show();
                break;
            case 4:
                Toast.makeText(MainActivity.this, "菜單四被選擇了", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public boolean onMenuOpened(int featureId, Menu menu) {//菜單打開事件監(jiān)聽
        Toast.makeText(MainActivity.this, "選項(xiàng)菜單開啟", Toast.LENGTH_SHORT).show();
        return super.onMenuOpened(featureId, menu);
    }
    @Override
    public void onOptionsMenuClosed(Menu menu) {//菜單關(guān)閉事件監(jiān)聽
        super.onOptionsMenuClosed(menu);
        Toast.makeText(MainActivity.this, "選項(xiàng)菜單關(guān)閉", Toast.LENGTH_SHORT).show();
    }
}

這里采用了動(dòng)態(tài)添加的方式,調(diào)用了Menu類的add方法,如下: public MenuItem add(int groupId, int itemId, int order, CharSequence title); add方法中需要傳入四個(gè)參數(shù):

  • groupId:組別,不分組可以寫Menu.NONE
  • itemId:子菜單項(xiàng)Id,作為子菜單的唯一標(biāo)識(shí)
  • order:菜單顯示順序
  • title:菜單文本顯示

菜單選擇事件監(jiān)聽通過傳入的MenuItem對(duì)象,并調(diào)用其getItemId來判斷哪一個(gè)子菜單被選擇了。

運(yùn)行項(xiàng)目實(shí)例如下:

http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-4.png" alt="這里寫圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-5.png" alt="這里寫圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-6.png" alt="這里寫圖片描述" />

點(diǎn)擊選項(xiàng)菜單按鈕時(shí),選項(xiàng)菜單彈出,選項(xiàng)菜單開啟事件觸發(fā),選擇菜單二,選擇事件觸發(fā),選擇完成后,菜單自動(dòng)關(guān)閉,這時(shí)選項(xiàng)菜單關(guān)閉事件觸發(fā)。

細(xì)心的讀者會(huì)發(fā)現(xiàn),上面的實(shí)例中設(shè)置了子菜單的圖標(biāo),但是并沒有顯示,原因是在Android2.3以上的版本的源碼進(jìn)行了改變,若要想顯示圖標(biāo)可以通過修改源碼實(shí)現(xiàn),這一方法可以參考博文:http://blog.csdn.net/stevenhu_223/article/details/9705173。我們這里給出一個(gè)自定義彈出框的形式來實(shí)現(xiàn)更美觀的菜單選項(xiàng)。

彈出框布局文件(view.xml) 彈出框布局采用GridView控件進(jìn)行布局,代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <GridView
        android:id="@+id/gridview"
        android:layout_width="300dp"
        android:layout_height="150dp"
        android:gravity="center"
        android:numColumns="3" />
</LinearLayout>

GridView子布局文件(item.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout_Item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">
    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerHorizontal="true"></ImageView>
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/iv_icon"
        android:layout_centerHorizontal="true"
        android:text="選項(xiàng)"></TextView>
</RelativeLayout>

MainActivity代碼(MainActivity.java)

public class MainActivity extends Activity {
    private AlertDialog alertDialog;
    private GridView gridView;
    private View view;
    private int[] icons = {R.drawable.exit, R.drawable.fold, R.drawable.set, R.drawable.newpic, R.drawable.more};
    private String[] titles = {"退出", "文件", "設(shè)置", "新建", "更多"};
    private SimpleAdapter simpleAdapter;
    private List<Map<String, Object>> datas;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        view = LayoutInflater.from(this).inflate(R.layout.view, null);//獲得彈出框布局文件對(duì)象
        initDatas();//初始化數(shù)據(jù)集
        //初始化SimpleAdapter
        simpleAdapter = new SimpleAdapter(this, datas, R.layout.item, new String[]{"icon", "title"}, new int[]{R.id.iv_icon, R.id.tv_title});
        alertDialog=new AlertDialog.Builder(this).create();//創(chuàng)建彈出框
        alertDialog.setView(view);//設(shè)置彈出框布局
        gridView=(GridView)view.findViewById(R.id.gridview);
        gridView.setAdapter(simpleAdapter);//設(shè)置適配器
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {//GridView子項(xiàng)單擊事件監(jiān)聽
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this,"您點(diǎn)擊了"+titles[position]+"按鈕",Toast.LENGTH_SHORT).show();
                alertDialog.dismiss();
            }
        });
    }
    private void initDatas() {
        datas = new ArrayList<>();
        for (int i = 0; i < titles.length; i++) {
            Map map = new HashMap();
            map.put("icon", icons[i]);
            map.put("title", titles[i]);
            datas.add(map);
        }
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {//覆寫了onKeyDown方法
        if(keyCode==KeyEvent.KEYCODE_MENU){//當(dāng)按下菜單鍵時(shí)
            if (alertDialog == null) {
                alertDialog = new AlertDialog.Builder(this).setView(view).show();
            } else
                alertDialog.show();
        }
        return super.onKeyDown(keyCode, event);
    }
}

這里覆寫了onKeyDown方法,當(dāng)菜單鍵按下時(shí),彈出對(duì)話框,對(duì)話框布局采用了GridView控件,設(shè)置了GridView子項(xiàng)單擊事件監(jiān)聽,處理對(duì)于邏輯。SimpleAdapter適配器類初始化時(shí)要傳入五個(gè)參數(shù),不熟悉的讀者可以參考前面的GridView章節(jié)。

運(yùn)行實(shí)例如下:

http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-7.png" alt="這里寫圖片描述" /> http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/19-8.png" alt="這里寫圖片描述" />

點(diǎn)擊設(shè)置按鈕,彈出對(duì)話菜單選擇框,選擇對(duì)應(yīng)的子菜單對(duì)應(yīng)不同的邏輯操作。