Android第四十一天

 

1.概念java

        <1>Android應用中的菜單默認是隱藏的,只有當用戶點擊手機上的MENU鍵,系統纔會顯示菜單。這種菜單叫作選項菜單(Option Menu)。android

        <2>從3.0開始,Android不要求手機設備上必須提供MENU按鍵。所以Android推薦使用ActionBar來代替Menu。ide

二、分類佈局

        <1>OptionsMenu 按手機menu彈出的菜單ui

                (1)重寫public boolean onCreateOptionsMenu(menu)方法this

// 顯示彈出菜單佈局必需要重寫的方法,在這個地方加載菜單文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
setIconEnable(menu, true);
// 必需要返回true
return true;
}

                (2)建立菜單項MenuItemcode

                                a.建立菜單XML文件,必須以<menu>爲根標籤xml

                                        菜單XML的位置:/res/menu/對象

                                        <item>標籤屬性繼承

                                                android:id表示item的id

                                                android:icon表示菜單的圖標,4.0系統僅在ActionBar上顯示圖標

                                                android:title表示菜單的文字

                                        二級子菜單

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/file"
android:title="@string/file" >
<!-- "file" 的子菜單 -->
<menu>
<item android:id="@+id/create_new"
android:title="@string/create_new" />
<item android:id="@+id/open"
android:title="@string/open" />
</menu>
</item>
</menu>

                                        二級組菜單

<item
android:id="@+id/menu_group2"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字顏色">
<menu >
<group>
<item android:id="@+id/font_red" android:title="red" />
<item android:id="@+id/font_green" android:title="green"></item>
<item android:id="@+id/font_blue" android:title="blue"></item>
<item android:id="@+id/font_yellow" android:title="yellow"></item>
</group>
</menu>
</item>

                                        二級可選組菜單

<item
android:id="@+id/menu_group1"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字尺寸">
<menu >

<!-- android:checkableBehavior 屬性有三個可選值:all爲多選,single爲單選,none爲不可選。爲none時就是一個普通菜單 -->

<group android:checkableBehavior="single">
<item android:id="@+id/font_10" android:title="10sp"></item>
<item android:id="@+id/font_15" android:title="15sp"></item>
<item android:id="@+id/font_20" android:title="20sp"></item>
<item android:id="@+id/font_25" android:title="25sp"></item>
<item android:id="@+id/font_30" android:title="30sp"></item>
</group>
</menu>
</item>

                                        經過MenuInflater.inflater(int menuId,menu)方法將菜單項追加到菜單中

                                b.menu.add()方法增長菜單

                                        menu.add()方法返回MenuItem對象

                                                setIcon (int iconRes)

                                                setTitle (CharSequence title)

                                                setOnMenuItemClickListener(OnMenuItemClickListener)

                                                setIntent(Intent)設置點擊菜單項時打開的窗口

                                        menu.add(CharSequence) :通常使用方法,增長菜單名稱

                                        menu.add(0, 1, 1, "拍照")

                                                第一個參數爲GroupID,Group即將菜單項分組

                                                第二個參數爲ItemID,指的是菜單項的id

                                                第三個參數爲order,指定菜單項的位置順序

                                                第四個參數爲title,指的是菜單項所顯示的文字

                (3)重寫public boolean onOptionsItemSelected(MenuItem item)方法,實現菜單項的選擇事件

// 要作彈出菜單的點擊事件必須重寫的方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// 獲取被點擊的菜單的id
int id = item.getItemId();
switch (id) {
case R.id.item2:
Toast.makeText(this, "清除"+item.getTitle(), Toast.LENGTH_SHORT).show();
break;
case R.id.item3:
Toast.makeText(this, "殺毒"+item.getTitle(), Toast.LENGTH_SHORT).show();
break;
case R.id.item4:
Toast.makeText(this, "撥號"+item.getTitle(), Toast.LENGTH_SHORT).show();
break;

default:
break;
}
return super.onOptionsItemSelected(item);
}

        <2>ContextMenu 長按綁定UI控件的上下文菜單(上下文菜單繼承自android.view.Menu)

                (1)上下文菜單與Options Menu最大的不一樣在於:

                                Options Menu的擁有者是Activity,而上下文菜單的擁有者是Activity中的View;

每一個Activity最多隻有一個Options Menu,它爲整個Activity服務。而一個Activity每每有多個View,哪一個View須要上下文菜單就經過registerForContextMenu(View view)給這個View註冊上下文菜單。

                (2)生成上下文菜單是經過Activity中的onCreateContextMenu()方法:

                                onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法;

二者的不一樣在於:onCreateOptionsMenu只在用戶第一次按「Menu」鍵時被調用,而onCreateContextMenu會在用戶每一次長按註冊了上下文菜單的View時被調用。

                (3)ContextMenuInfo 有什麼用呢?

                                當視圖元素須要向上下文菜單傳遞一些信息,好比該View對應DB記錄的id等,這就要使用ContextMenuInfo。須要傳遞額外信息的View須要重寫getContextMenuInfo()方法,返回一個帶有數據的ContextMenuInfo實現類對象。

                                ContextMenuInfo攜帶了註冊上下文菜單控件的一些額外信息。通常用在AdaterViews(例如:Spinner 、ListView或GridView)上,能夠在ContextMenuInfo 中獲取到適配器View中的position的信息。

                (4)開發上下文菜單的步驟:

                                重寫onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)方法;

                                調用Activity的registerForContextMenu(View view)方法爲view組件註冊上下文菜單;(註冊上下文菜單後,意味着用戶長按該控件後顯示上下文菜單)。

                                        建立菜單xml文件,必須以<menu>爲根標籤

                                        menu.setHeaderTitle(String) 設置窗口頭的標題

                                        menu.setHeaderIcon(R.drawable.face) 設置窗口頭的圖標

                                爲菜單項提供響應,重寫onContextItemSelected(MenuItem item)。

                                Activity.registerForContextMenu(須要顯示ContextMenu的控件)

        <3>PopupMenu  在指定UI控件的下方或上方顯示的彈出菜單

                (1)PopupMenu(Context context, View anchor): 第二個參數是指彈出菜單顯示的哪個控件的下方或上方

                (2)MenuInflater.inflate(int menuResId,PopupMenu.getMenu()) 加載菜單資源到彈出菜單對象中

                (3)setOnMenuItemClickListener() 設置彈出菜單項的點擊事件

                (4)show() 彈出菜單

                (5)dismiss() 關閉菜單

        <4>解決菜單項不顯示圖標的問題

 
//enable爲true時,菜單添加圖標有效,enable爲false時無效。
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);

//MenuBuilder實現Menu接口,建立菜單時,傳進來的menu其實就是MenuBuilder對象(java的多態特徵)
m.invoke(menu, enable);

} catch (Exception e)
{
e.printStackTrace();
}
}
相關文章
相關標籤/搜索