編輯:Android技術基礎
本章給大家帶來的是Android中的Menu(菜單),而在Android中的菜單有如下幾種:
- OptionMenu:選項菜單,android中最常見的菜單,通過Menu鍵來調用
- SubMenu:子菜單,android中點擊子菜單將彈出一個顯示子菜單項的懸浮框, 子菜單不支持嵌套,即不能包括其他子菜單
- ContextMenu:上下文菜單,通過長按某個視圖組件後出現的菜單,該組件需注冊上下文菜單 本節我們來依依學習這幾種菜單的用法~ PS:官方文檔:menus
答:非常簡單,重寫兩個方法就好,其實這兩個方法我們在創建項目的時候就會自動生成~ 他們分別是:
- public boolean onCreateOptionsMenu(Menu menu):調用OptionMenu,在這裡完成菜單初始化
- public boolean onOptionsItemSelected(MenuItem item):菜單項被選中時觸發,這裡完成事件處理
當然除了上面這兩個方法我們可以重寫外我們還可以重寫這三個方法:
- public void onOptionsMenuClosed(Menu menu):菜單關閉會調用該方法
- public boolean onPrepareOptionsMenu(Menu menu):選項菜單顯示前會調用該方法, 可在這裡進行菜單的調整(動態加載菜單列表)
- public boolean onMenuOpened(int featureId, Menu menu):選項菜單打開以後會調用這個方法
而加載菜單的方式有兩種,一種是直接通過編寫菜單XML文件,然後調用: getMenuInflater().inflate(R.menu.menu_main, menu);加載菜單 或者通過代碼動態添加,onCreateOptionsMenu的參數menu,調用add方法添加 菜單,add(菜單項的組號,ID,排序號,標題),另外如果排序號是按添加順序排序的話都填0即可!
運行效果圖:
代碼實現:
MainActivity.java:
public class MainActivity extends AppCompatActivity { //1.定義不同顏色的菜單項的標識: 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,"藍色"); menu.add(1,YELLOW,1,"黃色"); menu.add(1,GRAY,5,"灰色"); menu.add(1,CYAN,6,"藍綠色"); 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(選項菜單)中動態添加菜單, 以及事件處理,根據id判斷用戶點擊的是哪一項,然後執行對應的操作! 另外,有一點要注意的是,選項菜單經過了三個階段的過渡: 在Android 2.3.x或者更低版本,因為該階段大部分的機型都是帶有Menu鍵的, 此階段通過點擊Menu鍵彈出菜單:
而在Android 3.0或者更高的版本,則是通過3.0引入的ActionBar中的setting菜單:
而在5.0以上的版本則是在ToolBar中的,點擊後出一個溢出式的菜單樣式
另外通過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後出現的菜單,我們需要為這個View注冊上下文菜單!
答:使用的流程如下:
- Step 1:重寫onCreateContextMenu()方法
- Step 2:為view組件注冊上下文菜單,使用registerForContextMenu()方法,參數是View
- Step 3:重寫onContextItemSelected()方法為菜單項指定事件監聽器
上面的OptionMenu我們使用了Java代碼的方法來完成菜單項的添加,這裡我們就用XML文件的 方式來生成我們的CotnextMenu吧,另外關於使用Java代碼來生成菜單還是使用XML來生成菜單, 建議使用後者來定義菜單,這樣可以減少Java代碼的代碼臃腫,而且不用每次都用代碼分配 id,只需修改XML文件即可修改菜單的內容,這樣在一定程度上位程序提供的了更好的解耦, 低耦合,高內聚,是吧~
運行效果圖:
實現代碼:
我們先來編寫選項菜單的菜單XML文件:
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="@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>
接著我們在選項菜單的那個基礎上,添加一個TextView,然後加上下面一些東西:
private TextView tv_context; tv_context = (TextView) findViewById(R.id.tv_context); registerForContextMenu(tv_context); //重寫與ContextMenu相關方法 @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(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設置上下文,switch(v.getId)你懂的~ 另外,和等下要講的子菜單一樣,上下文菜單都無法顯示圖標!
所謂的子菜單只是在<**item**>中又嵌套了一層<**menu**>而已
運行效果圖
:實現代碼:
編寫子菜單的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>
接著我們改下上面上下文菜單的兩個方法的內容,換上下面的代碼:
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,"你點擊了子菜單一",Toast.LENGTH_SHORT).show(); break; case R.id.two: item.setCheckable(true); Toast.makeText(MainActivity.this,"你點擊了子菜單二",Toast.LENGTH_SHORT).show(); break; case R.id.three: Toast.makeText(MainActivity.this,"你點擊了子菜單三",Toast.LENGTH_SHORT).show(); item.setCheckable(true); break; } return true; }
好的,灰常簡單是吧,另外,如果你想在Java代碼中添加子菜單的話,可以調用addSubMenu()
比如:SubMenu file = menu.addSubMenu("文件");file還需要addItem添加菜單項哦!
一個類似於PopupWindow的東東,他可以很方便的在指定View下顯示一個彈出菜單,而且 他的菜單選項可以來自於Menu資源,下面我們寫個簡單的例子來使用下這個東東~
運行效果圖:
實現代碼:
菜單資源文件: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>
在布局中添加一個按鈕,然後添加點擊事件:
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,"你點了小豬~", Toast.LENGTH_SHORT).show(); break; case R.id.bpig: Toast.makeText(MainActivity.this,"你點了大豬~", Toast.LENGTH_SHORT).show(); break; } return true; } }); popup.show(); } });
非常簡單,新技能get了沒?
MenuDemo1.zip
好的,本節給大家介紹了Android中的三種菜單,選項菜單,上下文菜單以及子菜單,最後 還講解了一個PopupMenu的控件,這裡只演示了基本的用法,其他屬性可自行查閱文檔, 文檔才是最好的老師~嗯,就說這麼多,謝謝,對了今天國慶,祝大家國慶玩得開心!
本節引言:嘿嘿,看到這個題目,相信部分讀者會問,你前面的Fragment寫完了嗎?嗯,沒寫完,因為想例子,需要一點時間,為了提高效率,所以決定像多線
本節引言: 本節帶來的是Android基本UI控件中的第十個:ScrollView(滾動條),或者我們應該叫他 豎直滾動條,對應的另外一個水平方向上的滾動條:Hori
在Android App應用中,OnTouch事件表示觸摸事件,本章我們通過滑過圖像獲取當前位置理解其具體用法。 知識點:OnTouch 一、設計界面
本節引言:作為ListView經典問題之一,如果你嘗試過自定義ListView的item,在上面帶有一個checkbox的話,那麼當你的item數超