Android学习笔记十九之Menu菜单
2017-09-04 10:19
246 查看
Android学习笔记十九之Menu菜单
之前我们已经学习过Android的基本UI控件和android的五大布局LinearLayout线性布局、RelativeLayout相对布局、FrameLayout帧布局、GridLayout网格布局和TableLayout表格布局,下面我们来学习Android的其他控件,这些控件能让我们的APP更加友好和人性化。
Menu菜单
今天我们来学习第一个友好交互控件,Menu菜单。在AndroidOS中,Menu菜单有三种,分别是:OptionMenu(选项菜单)、ContextMenu(上下文菜单)和SubMenu(子菜单)。下面我们分别来介绍一下它们。
OptionMenu选项菜单
OptionMenu是Android中最常见的菜单,通过手机上的Menu键可以唤出。使用方法非常简单,只需要重写onCreateOptionsMenu(Menu menu)和 onOptionsItemSelected(MenuItem item)这两个方法即可,前者是OptionMenu创建的时候调用,完成初始化,只调用一次;后者是菜单项被选中是触发的事件,在这里完成Menu选项事件处理。除了这两个方法之外,我们还可以重写OptionMenu的以下三个方法:onOptionsMenuClosed(Menumenu)菜单关闭时候回调方法、onPrepareOptionsMenu(Menu menu)菜单显示前回调方法、 onMenuOpened(int featureId, Menu menu)菜单打开之后回调方法。
下面我们通过一个例子说明:
Activity代码:
package com.example.menudemo; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; /** * Created by Devin on 2016/7/4. */ public class OptionMenuActivity extends AppCompatActivity { private final static int BASKETBALL = 10001; private final static int FOOTBALL = 10002; private final static int VOLLEYBALL = 10003; private final static int BALLOON = 10004; private final static int PINGPONG = 10005; private final static int BASEBALL = 10006; private TextView tv_option_menu; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_optionmenu); tv_option_menu = (TextView) findViewById(R.id.tv_option_menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { //int groupId, int itemId, int order, CharSequence title menu.add(1, BASKETBALL, 2, "篮球"); menu.add(1, FOOTBALL, 3, "足球"); menu.add(1, VOLLEYBALL, 4, "排球"); menu.add(1, BALLOON, 5, "气球"); menu.add(1, PINGPONG, 6, "乒乓球"); menu.add(1, BASEBALL, 7, "棒球"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case BASKETBALL: tv_option_menu.setText("你喜欢篮球吗?"); break; case FOOTBALL: tv_option_menu.setText("你喜欢足球吗?"); break; case VOLLEYBALL: tv_option_menu.setText("你喜欢排球吗?"); break; case BALLOON: tv_option_menu.setText("你喜欢气球吗?"); break; case PINGPONG: tv_option_menu.setText("你喜欢乒乓球吗?"); break; case BASEBALL: tv_option_menu.setText("你喜欢棒球吗?"); break; } return super.onOptionsItemSelected(item); } }
实现效果图:
这里实现比较简单,就不在做很多的介绍了。添加菜单有两种方法,可以通过定义XML文件,然后调用getMenuInflater().inflate(R.menu.menu_main, menu)加载,也可以像上面例子一样通过代码添加,即是add的方法。
ContextMenu上下文菜单
当我们长时间按住一个View组件的时候,会弹出一个菜单,那个菜单就是ContextMenu。使用ContextMenu需要经历如下三个步骤:第一步是重写onCreateContextMenu(ContextMenu menu, View view,ContextMenuInfo menuInfo)方法,第二步是为view组件注册上下文菜单,即是调用 registerForContextMenu(View) 方法,第三步是给菜单项指定事件监听器,即是重写onContextItemSelected(MenuItemitem)方法,下面我们用一个例子说明一下:
上面我们已经实现了用代码加载菜单项,现在我们采用XML文件来加载菜单项,这样修改的时候只需要修改XML文件即可,也减轻了Java代码的臃肿。
Activity代码:
package com.example.menudemo; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.ContextMenu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Toast; /** * Created by Devin on 2016/7/4. */ public class ContextMenuActivity extends AppCompatActivity { private Button btn_show_context_menu; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contextmenu); btn_show_context_menu = (Button) findViewById(R.id.btn_show_context_menu); registerForContextMenu(btn_show_context_menu); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater menuInflater = new MenuInflater(this); menuInflater.inflate(R.menu.context_menu, menu); super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.basketball: Toast.makeText(getApplicationContext(), "你选择了篮球", Toast.LENGTH_SHORT).show(); break; case R.id.football: Toast.makeText(getApplicationContext(), "你选择了足球", Toast.LENGTH_SHORT).show(); break; case R.id.baseball: Toast.makeText(getApplicationContext(), "你选择了棒球", Toast.LENGTH_SHORT).show(); break; case R.id.pingpang: Toast.makeText(getApplicationContext(), "你选择了乒乓球", Toast.LENGTH_SHORT).show(); break; case R.id.balloon: Toast.makeText(getApplicationContext(), "你选择了汽球", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); } }
menu中XML代码:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/context_menu_item" android:checkableBehavior="none"> <item android:id="@+id/basketball" android:title="篮球" /> <item android:id="@+id/football" android:title="足球" /> <item android:id="@+id/baseball" android:title="棒球" /> <item android:id="@+id/pingpang" android:title="乒乓球" /> <item android:id="@+id/balloon" android:title="汽球" /> </group> </menu>
实现的效果图:
布局文件比较简单,就不在贴出代码了。其中,需要在res目录下新建一个文件夹menu。
SubMenu子菜单
子菜单相当于在菜单的item中又嵌套一层菜单。就不多介绍了,下面我们直接实现一个例子:Activity代码:
package com.example.menudemo; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.ContextMenu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; /** * Created by Devin on 2016/7/4. */ public class SubMenuActivity extends AppCompatActivity { private Button btn_show_sub_menu; private TextView tv_show_sub; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_submenu); btn_show_sub_menu = (Button) findViewById(R.id.btn_show_sub_menu); registerForContextMenu(btn_show_sub_menu); tv_show_sub = (TextView) findViewById(R.id.tv_show_sub); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater menuInflater = new MenuInflater(this); menuInflater.inflate(R.menu.sub_menu, menu); super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.app: tv_show_sub.setText("你选择的是水果类的苹果"); break; case R.id.pear: tv_show_sub.setText("你选择的是水果类的雪梨"); break; case R.id.grape: tv_show_sub.setText("你选择的是水果类的葡萄"); break; case R.id.sub_basketball: tv_show_sub.setText("你选择的是球类的篮球"); break; case R.id.sub_football: tv_show_sub.setText("你选择的是球类的足球"); break; case R.id.sub_balloon: tv_show_sub.setText("你选择的是球类的汽球"); break; case R.id.java: tv_show_sub.setText("你选择的是语言类的Java"); break; case R.id.Swift: tv_show_sub.setText("你选择的是语言类的swift"); break; case R.id.php: tv_show_sub.setText("你选择的是语言类的PHP"); break; } return super.onContextItemSelected(item); } }
menu的XML文件代码:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="none"> <item android:id="@+id/fruit" android:title="水果"> <menu> <group android:checkableBehavior="none"> <item android:id="@+id/app" android:title="苹果" /> <item android:id="@+id/pear" android:title="雪梨" /> <item android:id="@+id/grape" android:title="葡萄" /> </group> </menu> </item> <item android:id="@+id/ball" android:title="球类"> <menu> <group android:checkableBehavior="none"> <item android:id="@+id/sub_basketball" android:title="篮球" /> <item android:id="@+id/sub_football" android:title="足球" /> <item android:id="@+id/sub_balloon" android:title="气球" /> </group> </menu> </item> <item android:id="@+id/language" android:title="语言"> <menu> <group android:checkableBehavior="none"> <item android:id="@+id/java" android:title="JAVA" /> <item android:id="@+id/Swift" android:title="Swift" /> <item android:id="@+id/php" android:title="PHP" /> </group> </menu> </item> </group> </menu>
实现的效果图:
这里实现的是非常简单的,更加复杂就按需要实现。
最后还介绍一个PopupMenu(弹出式菜单),直接实现一个小例子
java代码:
btn_popup_menu = (Button) findViewById(R.id.btn_popup_menu); btn_popup_menu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { PopupMenu popupMenu = new PopupMenu(MainActivity.this, btn_option_menu); popupMenu.getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu()); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.popup_java: Toast.makeText(MainActivity.this, "你选择了JAVA语言", Toast.LENGTH_SHORT).show(); break; case R.id.popup_Swift: Toast.makeText(MainActivity.this, "你选择了Swift语言", Toast.LENGTH_SHORT).show(); break; case R.id.popup_php: Toast.makeText(MainActivity.this, "你选择了PHP语言", Toast.LENGTH_SHORT).show(); break; } return true; } }); popupMenu.show(); } });
menu的XML文件代码:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="none"> <item android:id="@+id/popup_java" android:title="JAVA" /> <item android:id="@+id/popup_Swift" android:title="Swift" /> <item android:id="@+id/popup_php" android:title="PHP" /> </group> </menu>
实现的效果图:
到这里就基本介绍完了Menu的基本知识,我们可以使用menu实现很多的功能。
点击下载源码,最后照例附上国内镜像API
相关文章推荐
- Android学习笔记十九之Menu菜单
- 【转】 Pro Android学习笔记(三二):Menu(3):Context菜单
- Android学习笔记之Menu一级菜单、二级菜单的使用
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
- 【转】 Pro Android学习笔记(三四):Menu(5):动态菜单
- 【Android学习笔记】 菜单Menu
- 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
- Android学习笔记02_菜单(menu)
- Pro Android学习笔记(三二):Menu(3):Context菜单
- Android学习笔记--Menu菜单的使用
- Pro Android学习笔记(三三):Menu(4):Alternative菜单
- Pro Android学习笔记(三二):Menu(3):Context菜单
- Pro Android学习笔记(三四):Menu(5):动态菜单
- Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
- android菜单(menu)用法
- menu菜单
- Android menu菜单介绍
- Android基础教程(五)之-----Menu功能菜单设计
- android menu菜单
- Menu组件显示二级菜单时seperate间距太大问题。