Android中的Menu
文章目錄
- 1 Menu介紹
- 1.1 Menu的發(fā)展
- 1.2 菜單的分類(lèi)
- 2 選項(xiàng)菜單(OptionMenu)
- 2.1 選項(xiàng)菜單的xml文件及java文件
- 3 上下文菜單(ContextMenu)
- 3.1 上下文菜單介紹
- 3.2 上下文操作菜單代碼實(shí)現(xiàn)
- 4 彈出菜單(PopupMenu)
- 4.1 彈出菜單介紹
- 4.2 彈出式菜單的代碼實(shí)現(xiàn)
- 5 關(guān)于菜單的注意事項(xiàng)
1 Menu介紹
1.1 Menu的發(fā)展
3.0以前的Menu:
- 在Android3.0,當(dāng)用戶(hù)按“菜單”按鈕時(shí),選項(xiàng)菜單的內(nèi)容會(huì)出現(xiàn)在屏幕底部,可包含多達(dá) 6 個(gè)菜單項(xiàng),超出部分則以“更多”來(lái)顯示。
3.0以后的Menu:
- 在Android3.0及更高版本的系統(tǒng)中,選項(xiàng)菜單中的項(xiàng)目將出現(xiàn)在操作欄中,用戶(hù)通過(guò)操作欄右側(cè)的操作或者點(diǎn)擊設(shè)備菜單按鈕來(lái)溢出菜單圖標(biāo)。
1.2 菜單的分類(lèi)
Menu分類(lèi)
- 選項(xiàng)菜單(OptionMenu)
- 上下文菜單(ContextMenu)
- 彈出菜單(PopupMenu)
2 選項(xiàng)菜單(OptionMenu)
選項(xiàng)菜單是一個(gè)應(yīng)用的主菜單項(xiàng),用于放置對(duì)應(yīng)用產(chǎn)生全局影響的操作,如搜索/設(shè)置。
2.1 選項(xiàng)菜單的xml文件及java文件
選項(xiàng)菜單我們需要?jiǎng)?chuàng)建在res目錄下,如下圖所示:
xml文件如下:
對(duì)應(yīng)的java文件如下:
package com.example.para_huang.imoocapplication;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//創(chuàng)建OptionMenu@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//加載菜單資源//通過(guò)XML資源來(lái)設(shè)計(jì)menu//getMenuInflater().inflate(R.menu.option,menu);//純java代碼設(shè)計(jì)menu/*設(shè)置更多添加刪除*/ // Menu//參數(shù)1:組id 參數(shù)2:菜單項(xiàng)id 參數(shù)3:序號(hào) 參數(shù)4:設(shè)置menu.add(1, 1, 1,"設(shè)置");SubMenu sub = menu.addSubMenu(1,2,2,"更多"); // SubMenusub.add(2,3,1,"添加");sub.add(2,4,2,"刪除");//一定要記得返回true,否則菜單不顯示return true;}//OptionMenu菜單項(xiàng)的選中方法@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()){ // case R.id.save: // Toast.makeText(this,"保存",Toast.LENGTH_SHORT).show(); // break; // case R.id.setting: // Toast.makeText(this,"設(shè)置",Toast.LENGTH_SHORT).show(); // break; // case R.id.exit: // finish(); // break;case 1:Toast.makeText(this,"設(shè)置",Toast.LENGTH_SHORT).show();break;case 2:Toast.makeText(this,"更多",Toast.LENGTH_SHORT).show();break;case 3:Toast.makeText(this,"添加",Toast.LENGTH_SHORT).show();break;case 4:Toast.makeText(this,"刪除",Toast.LENGTH_SHORT).show();break;default:super.onOptionsItemSelected(item);}return true;} }3 上下文菜單(ContextMenu)
3.1 上下文菜單介紹
長(zhǎng)按某個(gè)item不放,就會(huì)在屏幕中間彈出ContextMenu。當(dāng)然我們也可以通過(guò)設(shè)置啟動(dòng)上下文操作模式,是的上下文菜單出現(xiàn)才菜單欄中。
3.2 上下文操作菜單代碼實(shí)現(xiàn)
先來(lái)看下menu的xml:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/delete"android:title="刪除" /><item android:title="重命名" ><menu ><itemandroid:id="@+id/opera1"android:title="操作1" /><itemandroid:id="@+id/opera2"android:title="操作2" /></menu></item> </menu>先看下上下文菜單在屏幕空間旁顯示的代碼實(shí)現(xiàn):
package com.example.para_huang.imoocapplication;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//ctx_btn:演示ContextMenu//1.注冊(cè)registerForContextMenu(findViewById(R.id.ctx_btn));//2.創(chuàng)建 覆蓋onCreateContextMenu//3.菜單項(xiàng)的操作 覆蓋onContextItemSelected}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {getMenuInflater().inflate(R.menu.context,menu);}@Overridepublic boolean onContextItemSelected(MenuItem item) {switch (item.getItemId()){case R.id.delete:Toast.makeText(this,"刪除",Toast.LENGTH_SHORT).show();break;case R.id.opera1:Toast.makeText(this,"操作1",Toast.LENGTH_SHORT).show();break;case R.id.opera2:Toast.makeText(this,"操作2",Toast.LENGTH_SHORT).show();break;}return super.onContextItemSelected(item);}下面看一下上下文菜單出現(xiàn)在菜單欄中的實(shí)現(xiàn):
package com.example.para_huang.imoocapplication;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//ctx_btn:演示ContextMenu//1.注冊(cè)//registerForContextMenu(findViewById(R.id.ctx_btn));//2.創(chuàng)建 覆蓋onCreateContextMenu//3.菜單項(xiàng)的操作 覆蓋onContextItemSelected//4.為按鈕設(shè)置上下文操作模式//①實(shí)現(xiàn)ActionMode CallBack//②在view的長(zhǎng)按事件中去啟動(dòng)上下文操作模式findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {startActionMode(cb);return false;}});}ActionMode.Callback cb = new ActionMode.Callback() {//創(chuàng)建,在啟動(dòng)上下文操作模式(startActionMode(Callback))時(shí)調(diào)用@Overridepublic boolean onCreateActionMode(ActionMode actionMode, Menu menu) {Log.e("TAG","創(chuàng)建");getMenuInflater().inflate(R.menu.context,menu);return true;}//在創(chuàng)建方法后進(jìn)行調(diào)用@Overridepublic boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {Log.e("TAG","準(zhǔn)備");return false;}@Overridepublic boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {Log.e("TAG","點(diǎn)擊");switch (menuItem.getItemId()){case R.id.delete:Toast.makeText(MainActivity.this,"刪除",Toast.LENGTH_SHORT).show();break;case R.id.opera1:Toast.makeText(MainActivity.this,"操作1",Toast.LENGTH_SHORT).show();break;case R.id.opera2:Toast.makeText(MainActivity.this,"操作2",Toast.LENGTH_SHORT).show();break;}return true;}//上下文操作模式結(jié)束時(shí)被調(diào)用@Overridepublic void onDestroyActionMode(ActionMode actionMode) {Log.e("TAG","結(jié)束");}}; }4 彈出菜單(PopupMenu)
4.1 彈出菜單介紹
一個(gè)模態(tài)形式展示的彈出風(fēng)格的菜單,綁在某個(gè)View上,一般出現(xiàn)在被綁定的View的下方。
4.2 彈出式菜單的代碼實(shí)現(xiàn)
簡(jiǎn)單的xml文件如下:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/copy"android:title="復(fù)制" /><itemandroid:id="@+id/paste"android:title="粘貼" /> </menu>java代碼如下:
package com.example.para_huang.imoocapplication;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.ActionMode; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.Button; import android.widget.PopupMenu; import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//popup_btn:演示PopupMenufinal Button popupBtn = findViewById(R.id.popup_btn);popupBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//①實(shí)例化PopupMenu對(duì)象 (參數(shù)2:被錨定的view)final PopupMenu menu = new PopupMenu(MainActivity.this,popupBtn);//②加載菜單資源:利用MenuInflater將Menu資源加載到PopupMenu.getMenu()所返回的Menu對(duì)象中//將R.menu.xx對(duì)于的菜單資源加載到彈出式菜單中menu.getMenuInflater().inflate(R.menu.popup,menu.getMenu());//③為PopupMenu設(shè)置點(diǎn)擊監(jiān)聽(tīng)器menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem menuItem) {switch (menuItem.getItemId()){case R.id.copy:Toast.makeText(MainActivity.this,"復(fù)制",Toast.LENGTH_SHORT).show();break;case R.id.paste:Toast.makeText(MainActivity.this,"粘貼",Toast.LENGTH_SHORT).show();break;}return false;}});//④千萬(wàn)不要忘記這一步,顯示PopupMenumenu.show();}});} }其實(shí)我們可以對(duì)于菜單的操作只是一種范式而已,并沒(méi)有什么技術(shù)難度。
5 關(guān)于菜單的注意事項(xiàng)
xml定義Menu的優(yōu)勢(shì):
- 清晰的菜單結(jié)構(gòu)
- 將菜單內(nèi)容與應(yīng)用的邏輯代碼分離
- 資源適配更容易
xml定義的Menu不顯示:
- onCreateOptionsMenu()方法必須返回true
- onOptionsItemSelected方法返回true
- 調(diào)用父類(lèi)的默認(rèn)實(shí)現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的Android中的Menu的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 相互宝审核不通过会通知吗
- 下一篇: Android中的Dialog