Android 菜单
我们继续来进行学习,今天写一下在软件中用的还算较多的菜单。
1、Menu
菜单,很显然,作用就是点击不同的选项触发不同的方法。现在在安卓使用中推荐使用ActionBar,但这里我们还是对菜单进行一个简单的解释。
菜单主要分为三类,选项菜单(Option Menu)、上下文菜单(Context Menu)和子菜单(Sub Menu),下面我们就一个一个来看一下。
(1)选项菜单
当用户单击软件上的菜单按钮,触发事件弹出的菜单框就是选项菜单。
这是效果图
先是布局代码
布局为在res文件夹下新建一个menu文件夹,在此文件夹下建xml文件。
1 <?xml version="1.0" encoding="utf-8"?> 2 <menu xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto"> 4 <item 5 android:id="@+id/mune_enter" 6 android:orderInCategory="100" 7 android:title="选项一" 8 app:showAsAction="never"/> 9 <item 10 android:id="@+id/mune_setting" 11 android:orderInCategory="100" 12 android:title="选项二" 13 app:showAsAction="never"/> 14 <item 15 android:id="@+id/mune_out" 16 android:orderInCategory="100" 17 android:title="选项三" 18 app:showAsAction="never"/> 19 </menu>
解释一下其中一些属性
- showAsAction 主要是针对这个菜单的显示起作用的,它有三个可选项
- always:总是显示在界面上
- never:不显示在界面上,只让出现在右边的三个点中
- ifRoom:如果有位置才显示,不然就出现在右边的三个点中
下面是java代码
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //导入菜单布局 public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } //这里是点击菜单项的触发事件 public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.mune_enter: Toast.makeText(this, "点击选项一", Toast.LENGTH_SHORT).show(); break; case R.id.mune_setting: Toast.makeText(this, "点击选项二", Toast.LENGTH_SHORT).show(); break; case R.id.mune_out: Toast.makeText(this, "点击选项三", Toast.LENGTH_SHORT).show(); break; default: break; } return super.onOptionsItemSelected(item); } }
(2)上下文菜单
当用户长按Activity页面时,弹出的菜单被称为上下文菜单。一般情况下ContextMenu常用于ListView或者GridView。
效果图
先是布局文件
这里的布局就是下载layout中,父布局为FrameLayout
1 <?xml version="1.0" encoding="utf-8"?> 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/container" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 7 <ListView 8 android:id="@+id/mune_list" 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" > 11 </ListView> 12 13 </FrameLayout>
这里没什么要说的,直接看下面。
java代码
public class MainActivity extends AppCompatActivity { private ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //加载数据 showListView(); // 注册上下文菜单 this.registerForContextMenu(listview); } //加载数据 private void showListView() { listview = (ListView) findViewById(R.id.mune_list); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getDate()); listview.setAdapter(adapter); } //创建数据源 private ArrayList<String> getDate() { ArrayList<String> list = new ArrayList<String>(); for (int i = 0; i < 10; i++) { list.add("菜单" + i); } return list; } //添加上下文菜单的菜单项 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { menu.setHeaderTitle("上下文菜单"); //加载上下文菜单内容 menu.add(1, 1, 1, "选项一"); menu.add(1, 2, 1, "选项二"); menu.add(1, 3, 1, "选项三"); super.onCreateContextMenu(menu, v, menuInfo); } //创建单击事件 public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: Toast.makeText(this, "点击选项一", 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; default: break; } return super.onContextItemSelected(item); } }
(3)子菜单
它就是将功能相同的操作进行分组显示,作用在选项菜单上,是选项菜单的二级菜单
效果图
先上布局文件
其实布局文件中可以什么都没有
1 <?xml version="1.0" encoding="utf-8"?> 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/container" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 7 <TextView 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:text="SubMenu" 11 android:textSize="20dp" /> 12 13 </FrameLayout>
然后是java代码
1 public class MainActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 } 8 @Override 9 public boolean onCreateOptionsMenu(Menu menu) { 10 SubMenu fileMenu = menu.addSubMenu("查看"); 11 SubMenu editMenu = menu.addSubMenu("输入"); 12 //添加菜单项 13 fileMenu.add(1, 1, 1, "查看1"); 14 fileMenu.add(1, 2, 1, "查看2"); 15 fileMenu.add(1, 3, 1, "查看3"); 16 editMenu.add(2, 1, 1, "输入1"); 17 editMenu.add(2, 2, 1, "输入2"); 18 editMenu.add(2, 3, 1, "输入3"); 19 return super.onCreateOptionsMenu(menu); 20 } 21 //创建点击事件 22 public boolean onOptionsItemSelected(MenuItem item) { 23 if (item.getGroupId() == 1) { 24 switch (item.getItemId()) { 25 case 1: 26 Toast.makeText(this, "点击了查看1", Toast.LENGTH_SHORT).show(); 27 break; 28 case 2: 29 Toast.makeText(this, "点击了查看2", Toast.LENGTH_SHORT).show(); 30 break; 31 case 3: 32 Toast.makeText(this, "点击了查看3", Toast.LENGTH_SHORT).show(); 33 break; 34 default: 35 break; 36 } 37 } else if (item.getGroupId() == 2) { 38 switch (item.getItemId()) { 39 case 1: 40 Toast.makeText(this, "点击了输入1", Toast.LENGTH_SHORT).show(); 41 break; 42 case 2: 43 Toast.makeText(this, "点击了输入2", Toast.LENGTH_SHORT).show(); 44 break; 45 case 3: 46 Toast.makeText(this, "点击了输入3", Toast.LENGTH_SHORT).show(); 47 break; 48 default: 49 break; 50 } 51 } 52 return super.onOptionsItemSelected(item); 53 } 54 }
上面就是菜单的用法了。。。。。。。
说一下ContextMenu与OptionMenu的区别:
- 1、OptionMenu对应的是activity,一个activity只能拥有一个选项菜单;
- 2、ContextMenu对应的是view,每个view都可以设置上下文菜单;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~