選單欄Menu用法講解
選單是Android應用中非常重要且常見的組成部分,能夠極大的節省我們頁面的使用空間,提高頁面的利用率,
安卓常用的選單有三種:
- OptionMenu:選項選單,android中最常見的選單,通過Menu鍵來呼叫
- ContextMenu:背景關系選單,通過長按某個視圖組件后出現的選單,該組件需注冊背景關系選單
- SubMenu:子選單,android中點擊子選單將彈出一個顯示子選單項的懸浮框, 子選單不支持嵌套,即不能包括其他子選單
定義選單的方式
- 一直接通過撰寫選單XML檔案,然后呼叫: getMenuInflater().inflate(R.menu.menu_main, menu);加載選單
- 通過代碼動態添加,onCreateOptionsMenu的引數menu,呼叫add方法添加選單,add(選單項的組號,ID,排序號,標題),另外如果排序號是按添加順序排序的話都填0即可!
我們一般使用XML去定義Menu,這樣可以減少Java代碼的代碼臃腫,而且不用每次都用代碼分配 id,只需修改XML檔案即可修改選單的內容,這樣在一定程度上位程式提供的了更好的解耦, 低耦合,高內聚
我們可以使用<menu>、<item>、<group>三種XML元素定義Menu:
<menu>是選單項的容器,<menu>元素必須是該檔案的根節點,并且能夠包含一個或多個<item>和<group>元素,
<item>是選單項,用于定義MenuItem,可以嵌套<menu>元素,以便創建子選單,
<group>是<item>元素的不可見容器(可選),可以使用它對選單項進行分組,使一組選單項共享可用性和可見性等屬性,
其中,<item>是我們主要的元素,它的常見屬性如下:
android:id:選單項(MenuItem)的唯一標識
android:icon:選單項的圖示(可選)
android:title:選單項的標題(必選)
android:showAsAction:指定選單項的顯示方式,常用的有 ifRoom 、 never 、 always、withText,多個屬性值之間可以使用|隔開,
一、選項選單(OptionMenu)
1. 常用的方法:
//呼叫OptionMenu,在這里完成選單初始化和加載
public boolean onCreateOptionsMenu(Menu menu)
//選單項被選中時觸發,這里完成事件處理
public boolean onOptionsItemSelected(MenuItem item)
//選單關倍訓呼叫該方法
public void onOptionsMenuClosed(Menu menu)
//選項選單顯示前會呼叫該方法, 可在這里進行選單的調整(動態加載選單串列)
public boolean onPrepareOptionsMenu(Menu menu)
//選項選單打開以后會呼叫這個方法
public boolean onMenuOpened(int featureId, Menu menu)
2.實體
實作這個非常的簡單,

實作:
專案結構

- 首先在res資源目錄下創建menu檔案夾,在創建一個
Menu Resource File取名為menu_optionmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu1"
android:title="創建群聊"
android:icon="@drawable/groupchat"/>
<item
android:id="@+id/menu2"
android:title="加好友/群"
android:icon="@drawable/add"/>
<item
android:id="@+id/menu3"
android:title="一起派對"
android:icon="@drawable/party"/>
<item
android:id="@+id/menu4"
android:title="掃一掃"
android:icon="@drawable/scan"/>
<item
android:id="@+id/menu5"
android:title="面對面快傳"
android:icon="@drawable/quick_pass"/>
<item
android:id="@+id/menu6"
android:title="收付款"
android:icon="@drawable/payment"/>
</menu>
- java代碼
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView=findViewById(R.id.text);
}
//該方法用于創建顯示Menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_optionmenu,menu);
return true;
}
//在選項選單打開以后會呼叫這個方法,設定menu圖示顯示(icon)
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (menu != null) {
if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {
try {
Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
method.setAccessible(true);
method.invoke(menu, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return super.onMenuOpened(featureId, menu);
}
//該方法對選單的item進行監聽
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
mTextView.setText(item.getTitle());
switch (item.getItemId()) {
case R.id.menu1:
Toast.makeText(this, "點擊了第" + 1 + "個", Toast.LENGTH_SHORT).show();
break;
case R.id.menu2:
Toast.makeText(this, "點擊了第" + 2 + "個", Toast.LENGTH_SHORT).show();
break;
case R.id.menu3:
Toast.makeText(this, "點擊了第" + 3 + "個", Toast.LENGTH_SHORT).show();
break;
case R.id.menu4:
Toast.makeText(this, "點擊了第" + 4 + "個", Toast.LENGTH_SHORT).show();
break;
case R.id.menu5:
Toast.makeText(this, "點擊了第" + 5 + "個", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
如果要是用java代碼來創建我們的menu,只需要在onCreateOptionsMenu方法中用menu的add方法添加即可
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//add的引數(選單項的組號,ID,排序號,標題)
menu.add(1,1,1,"創建群聊");
menu.add(1,1,2,"加好友/群");
menu.add(1,1,3,"一起派對");
menu.add(1,1,4,"掃一掃");
menu.add(1,1,5,"面對面快傳");
menu.add(1,1,6,"收付款");
//getMenuInflater().inflate(R.menu.menu_mian,menu);
return true;
}
二、背景關系選單(ContextMenu)
1. 使用步驟:
- 重寫onCreateContextMenu()方法
- 為view組件注冊背景關系選單,使用registerForContextMenu()方法,引數是View
- 重寫onContextItemSelected()方法為選單項指定事件監聽器
2. 實體

實作:
- 在menu檔案下新建一個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="藍色"/>
<item android:id="@+id/green" android:title="綠色"/>
<item android:id="@+id/red" android:title="紅色"/>
<item android:id="@+id/yellow" android:title="黃色"/>
</group>
</menu>
- java代碼
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView=findViewById(R.id.text);
registerForContextMenu(mTextView);//注冊背景關系選單
}
//重寫背景關系選單的創建方法
@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(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.blue:
mTextView.setTextColor(Color.BLUE);
break;
case R.id.green:
mTextView.setTextColor(Color.GREEN);
break;
case R.id.red:
mTextView.setTextColor(Color.RED);
break;
case R.id.yellow:
mTextView.setTextColor(Color.YELLOW);
break;
}
return super.onContextItemSelected(item);
}
}
三、子選單(SubMenu)
子選單就是在<item>中又嵌套了一層<menu>,也可以再嵌套一層,
1. 實體:

- 在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/colour" android:title="變顏色~">
<menu>
<group android:checkableBehavior = "none">
<item android:id="@+id/colour_blue" android:title="藍色"/>
<item android:id="@+id/colour_green" android:title="綠色"/>
<item android:id="@+id/colour_red" android:title="紅色"/>
<item android:id="@+id/colour_yellow" android:title="黃色"/>
</group>
</menu>
</item>
<item android:id="@+id/font_size" android:title="變字體大小~">
<menu>
<group android:checkableBehavior = "none">
<item android:id="@+id/font_size_10sp" android:title = "10sp"/>
<item android:id="@+id/font_size_30sp" android:title = "30sp"/>
<item android:id="@+id/font_size_50sp" android:title = "50sp"/>
<item android:id="@+id/font_size_70sp" android:title = "70sp"/>
</group>
</menu>
</item>
<item android:id="@+id/text" android:title="變文字~">
<menu>
<group android:checkableBehavior = "none">
<item android:id="@+id/text_hello" android:title = "你好"/>
<item android:id="@+id/text_menu" android:title = "選單"/>
<item android:id="@+id/text_MQ" android:title = "毛小錢"/>
<item android:id="@+id/text_div" android:title = "自定義"/>
</group>
</menu>
</item>
</menu>
- java代碼
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView=findViewById(R.id.text);
registerForContextMenu(mTextView);//注冊背景關系選單
}
//重寫背景關系選單的創建方法
@Override
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);
}
//背景關系選單的點擊事件
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.colour_blue:
mTextView.setTextColor(Color.BLUE);
break;
case R.id.colour_green:
mTextView.setTextColor(Color.GREEN);
break;
case R.id.colour_red:
mTextView.setTextColor(Color.RED);
break;
case R.id.colour_yellow:
mTextView.setTextColor(Color.YELLOW);
break;
case R.id.font_size_10sp:
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,10);
break;
case R.id.font_size_30sp:
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,30);
break;
case R.id.font_size_50sp:
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,50);
break;
case R.id.font_size_70sp:
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,70);
break;
case R.id.text_hello:
case R.id.text_menu:
case R.id.text_MQ:
mTextView.setText(item.getTitle());
break;
case R.id.text_div:
final EditText editText = new EditText(this);
AlertDialog dialog = new AlertDialog.Builder(this).setTitle("請輸入要自定義的文字")
.setView(editText)
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mTextView.setText(editText.getText().toString());
}
})
.setNegativeButton("取消",null)
.show();
break;
}
return super.onContextItemSelected(item);
}
}
關于Menu的使用就了解到這里了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/286980.html
標籤:其他
