W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
本章給大家?guī)淼氖茿ndroid中的Menu(菜單),而在Android中的菜單有如下幾種:
- OptionMenu:選項(xiàng)菜單,android中最常見的菜單,通過Menu鍵來調(diào)用
- SubMenu:子菜單,android中點(diǎn)擊子菜單將彈出一個顯示子菜單項(xiàng)的懸浮框, 子菜單不支持嵌套,即不能包括其他子菜單
- ContextMenu:上下文菜單,通過長按某個視圖組件后出現(xiàn)的菜單,該組件需注冊上下文菜單 本節(jié)我們來依依學(xué)習(xí)這幾種菜單的用法~ PS:官方文檔:menus
答:非常簡單,重寫兩個方法就好,其實(shí)這兩個方法我們在創(chuàng)建項(xiàng)目的時(shí)候就會自動生成~ 他們分別是:
- public boolean onCreateOptionsMenu(Menu menu):調(diào)用OptionMenu,在這里完成菜單初始化
- public boolean onOptionsItemSelected(MenuItem item):菜單項(xiàng)被選中時(shí)觸發(fā),這里完成事件處理
當(dāng)然除了上面這兩個方法我們可以重寫外我們還可以重寫這三個方法:
- public void onOptionsMenuClosed(Menu menu):菜單關(guān)閉會調(diào)用該方法
- public boolean onPrepareOptionsMenu(Menu menu):選項(xiàng)菜單顯示前會調(diào)用該方法, 可在這里進(jìn)行菜單的調(diào)整(動態(tài)加載菜單列表)
- public boolean onMenuOpened(int featureId, Menu menu):選項(xiàng)菜單打開以后會調(diào)用這個方法
而加載菜單的方式有兩種,一種是直接通過編寫菜單XML文件,然后調(diào)用:getMenuInflater().inflate(R.menu.menu_main, menu);加載菜單 或者通過代碼動態(tài)添加,onCreateOptionsMenu的參數(shù)menu,調(diào)用add方法添加 菜單,add(菜單項(xiàng)的組號,ID,排序號,標(biāo)題),另外如果排序號是按添加順序排序的話都填0即可!
運(yùn)行效果圖:
代碼實(shí)現(xiàn):
MainActivity.java:
public class MainActivity extends AppCompatActivity {
//1.定義不同顏色的菜單項(xiàng)的標(biāo)識:
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,"藍(lán)色");
menu.add(1,YELLOW,1,"黃色");
menu.add(1,GRAY,5,"灰色");
menu.add(1,CYAN,6,"藍(lán)綠色");
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);
}
}
代碼分析:
上述的代碼非常簡單,給大家演示了Android 5.0的中OptionMenu(選項(xiàng)菜單)中動態(tài)添加菜單, 以及事件處理,根據(jù)id判斷用戶點(diǎn)擊的是哪一項(xiàng),然后執(zhí)行對應(yīng)的操作! 另外,有一點(diǎn)要注意的是,選項(xiàng)菜單經(jīng)過了三個階段的過渡: 在Android 2.3.x或者更低版本,因?yàn)樵撾A段大部分的機(jī)型都是帶有Menu鍵的, 此階段通過點(diǎn)擊Menu鍵彈出菜單:
而在5.0以上的版本則是在ToolBar中的,點(diǎn)擊后出一個溢出式的菜單樣式
另外通過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>
其他的自行查閱文檔哈~
一開始我們就說了,長按某個View后出現(xiàn)的菜單,我們需要為這個View注冊上下文菜單!
答:使用的流程如下:
- Step 1:重寫onCreateContextMenu()方法
- Step 2:為view組件注冊上下文菜單,使用registerForContextMenu()方法,參數(shù)是View
- Step 3:重寫onContextItemSelected()方法為菜單項(xiàng)指定事件監(jiān)聽器
上面的OptionMenu我們使用了Java代碼的方法來完成菜單項(xiàng)的添加,這里我們就用XML文件的 方式來生成我們的CotnextMenu吧,另外關(guān)于使用Java代碼來生成菜單還是使用XML來生成菜單, 建議使用后者來定義菜單,這樣可以減少Java代碼的代碼臃腫,而且不用每次都用代碼分配 id,只需修改XML文件即可修改菜單的內(nèi)容,這樣在一定程度上位程序提供的了更好的解耦, 低耦合,高內(nèi)聚,是吧~
運(yùn)行效果圖:
實(shí)現(xiàn)代碼:
我們先來編寫選項(xiàng)菜單的菜單XML文件:
menu_context.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定義一組單選按鈕 -->
<!-- checkableBehavior的可選值由三個:single設(shè)置為單選,all為多選,none為普通選項(xiàng) -->
<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>
接著我們在選項(xiàng)菜單的那個基礎(chǔ)上,添加一個TextView,然后加上下面一些東西:
private TextView tv_context;
tv_context = (TextView) findViewById(R.id.tv_context);
registerForContextMenu(tv_context);
//重寫與ContextMenu相關(guān)方法
@Override
//重寫上下文菜單的創(chuàng)建方法
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);
}
//上下文菜單被點(diǎn)擊是觸發(fā)該方法
@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;
}
好的,就是那么簡單~可以為多個View設(shè)置上下文,switch(v.getId)你懂的~ 另外,和等下要講的子菜單一樣,上下文菜單都無法顯示圖標(biāo)!
所謂的子菜單只是在中又嵌套了一層而已
運(yùn)行效果圖
:
實(shí)現(xiàn)代碼:
編寫子菜單的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>
接著我們改下上面上下文菜單的兩個方法的內(nèi)容,換上下面的代碼:
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,"你點(diǎn)擊了子菜單一",Toast.LENGTH_SHORT).show();
break;
case R.id.two:
item.setCheckable(true);
Toast.makeText(MainActivity.this,"你點(diǎn)擊了子菜單二",Toast.LENGTH_SHORT).show();
break;
case R.id.three:
Toast.makeText(MainActivity.this,"你點(diǎn)擊了子菜單三",Toast.LENGTH_SHORT).show();
item.setCheckable(true);
break;
}
return true;
}
好的,灰常簡單是吧,另外,如果你想在Java代碼中添加子菜單的話,可以調(diào)用addSubMenu()
比如:SubMenu file = menu.addSubMenu("文件");file還需要addItem添加菜單項(xiàng)哦!
一個類似于PopupWindow的東東,他可以很方便的在指定View下顯示一個彈出菜單,而且 他的菜單選項(xiàng)可以來自于Menu資源,下面我們寫個簡單的例子來使用下這個東東~
運(yùn)行效果圖:
實(shí)現(xiàn)代碼:
菜單資源文件: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>
在布局中添加一個按鈕,然后添加點(diǎn)擊事件:
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,"你點(diǎn)了小豬~",
Toast.LENGTH_SHORT).show();
break;
case R.id.bpig:
Toast.makeText(MainActivity.this,"你點(diǎn)了大豬~",
Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
popup.show();
}
});
非常簡單,新技能get了沒?
好的,本節(jié)給大家介紹了Android中的三種菜單,選項(xiàng)菜單,上下文菜單以及子菜單,最后 還講解了一個PopupMenu的控件,這里只演示了基本的用法,其他屬性可自行查閱文檔, 文檔才是最好的老師~嗯,就說這么多,謝謝,對了今天國慶,祝大家國慶玩得開心!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: