软件开发专业网

15837636235

地址:无锡国家软件园
网 址:www.javaandc.com
邮 箱:renaide#126.com
手  机:15837636235
邮  编:100000
传 真:15837636235

android开发 > menu实现的两种方法

menu实现的两种方法
发布时间:2014-06-07 新闻来源:软件开发专业网 浏览次数:892000

   android软件开发网近前发现了在软件开发中有很多的值得我们思考的问题,下面就是android软件开发网总结的一些关于menu实现的两种方法: 

 
  大部分的应用程序都包括两种人机互动方式,一种是直接通过GUI的 Views,其可以满足大部分的交互操作。另外一种是应用Menu,当按下Menu按钮后,会弹出与当前活动状态下的应用程序相匹配的菜单。 这两种方式相比较都有各自的优势,而且可以很好的相辅相成,即便用户可以由主界面完成大部分操作,但是适当的拓展Menu功能可以更加完善应用程序,至少用户可以通过排列整齐的 按钮清晰的了解当前模式下可以使用的功能。
 
  有两种方法可以为Android APPs添加菜单功能,下边将对设置过程给出详细的介绍:
 
  第一种方法,通过Layout来添加静态菜单元素。
 
  一般情况下,开发者在res/Layout路径下来定义应用程序的GUI。应用Eclipse创建一个新项目后,可以看到res/layout中存在一个 预置的main.xml文件,其作为程序默认启动界面。同样,可以通过这种方式 创建一个静态的Menu,创建
 
  方法参阅下边的源代码:
 
  ?View Code XML
 
  <?xml version="1.0" encoding="utf-8"?>
 
  <menu xmlns:android="http://schemas.android.com/apk/res/android">
 
  <item
 
  android:id="@+id/previous"
 
  android:title="@string/previous"
 
  android:enabled="false"
 
  android:icon="@android:drawable/ic_media_previous"/>
 
  <!--these may not be available in next api (level > 3), so be carefull-->
 
  <item
 
  android:id="@+id/play_pause"
 
  android:title="@string/play"
 
  android:icon="@android:drawable/ic_media_play"/>
 
  <item
 
  android:id="@+id/next"
 
  android:title="@string/next"
 
  android:icon="@android:drawable/ic_menu_next"/>
 
  </menu>
 
  在Activity类中调用刚刚创建的Menu,首先将当前的Activity与指定的Menu XML相关联:
 
  @Override
 
  public booleanonCreateOptionsMenu(Menu menu) {
 
  super.onCreateOptionsMenu(menu);
 
  getMenuInflater().inflate(R.layout.menu_mainactivity, menu);
 
  return true;
 
  }
 
  实现onOptionsItemSelected方法: (其目的是捕捉到菜单触发事件后,对具体触发的选项作出响应,实际调用的函数包含在各自的case中)
 
  @Override
 
  public boolean onOptionsItemSelected(MenuItem item) {
 
  switch (item.getItemId()) {
 
  case R.id.previous:
 
  previous(); //go to previous song in the playlist
 
  return true;
 
  case R.id.play_pause:
 
  isPlaying() ? pause() : play(); //toggle play/pause
 
  return true;
 
  case R.id.next:
 
  next(); //go to next song in the playlist
 
  return true;
 
  }
 
  return false; //should never happen
 
  }
 
  最后可以通过onPrepareOptionMenu方法初始化Menu Items的属性:
 
  @Override
 
  public boolean onPrepareOptionsMenu(Menu menu) {
 
  //set play_pause menu item look
 
  if(isPlaying()) {
 
  menu
 
  .findItem(R.id.play_pause)
 
  .setTitle(R.string.pause)
 
  .setIcon(android.R.drawable.ic_media_pause);
 
  } else {
 
  menu
 
  .findItem(R.id.play_pause)
 
  .setTitle(R.string.play)
 
  .setIcon(android.R.drawable.ic_media_play);
 
  }
 
  return true;
 
  }
 
  大部分程序都通过这种方式添加Menu菜单功能,而且通过以上的步骤来看,其实现方法非常简单。
 
  第二种方法,在Activity类中动态创建Menu。
 
  首先需要定义Menu Item识别序号:
 
  public static final MENU_PREVIOUS = 0; //no more R.ids
 
  public static final MENU_PLAY_PAUSE = 1;
 
  public static final MENU_NEXT = 2;
 
  实现onCreateOptionMenu()方法:(第一种方法中已经通过xml定义了现成的Menu结构,所以不需要应用这个方法)
 
  @Override
 
  public boolean onCreateOptionsMenu(Menu menu) {
 
  menu
 
  .add(0, MENU_PREVIOUS, 0, R.string.previous)
 
  .setIcon(android.R.drawable.ic_media_previous);
 
  menu
 
  .add(0, MENU_PLAY_PAUSE, 0, R.string.play)
 
  .setIcon (android.R.drawable.ic_media_play);
 
  menu
 
  .add(0, MENU_NEXT, 0, R.string.next)
 
  .setIcon(android.R.drawable.ic_media_next);
 
  return true;
 
  }
 
  引用与第一种方法相同的方式来捕捉菜单的行为:
 
  @Override
 
  public boolean onOptionsItemSelected(MenuItem item) {
 
  switch (item.getItemId()) {
 
  case MENU_PREVIOUS:
 
  previous(); //go to previous song in the playlist
 
  return true;
 
  case MENU_PLAY_PAUSE:
 
  isPlaying() ? pause() : play(); //toggle play/pause
 
  return true;
 
  case MENU_NEXT:
 
  next(); //go to next song in the playlist
 
  return true;
 
  }
 
  return false; //should never happen
 
  }
 
  ————
 
  对以上两种方法的补充:
 
  根据需要设置不同Menu Item的属性:
 
  menu.findItem(R.id.next).setEnabled(false); 设置Menu Item从属关系(添加子父级别):
 
  直接写在方法中:
 
  menu
 
  .addSubMenu(R.id.repeat)
 
  .add(R.id.one)
 
  .add(R.id.all)
 
  .add(R.id.none);
 
  直接定义在XML Layout中:
 
  ?View Code XML
 
  <item android:id="@+id/repeat" android:title="@string/repeat">
 
  <menu>
 
  <item android:id="@+id/one" android:title="@string/repeat_one"></item>
 
  <item android:id="@+id/all" android:title="@string/repeat_all"></item>
 
  <item android:id="@+id/none" android:title="@string/repeat_none"></item>
 
  </menu>
 
  这两种不同的方法实现的目的是一样的,而且不存在本质上的却别,具体根据实际情况(根据项目的结构需要或者团队开发标准)选择合适的方法来创建Menu。
首页