Android基础之菜单详解

来源:互联网 发布:淘宝隐形降权怎么解决 编辑:程序博客网 时间:2024/05/21 14:10

android提供了三种菜单类型,分别为optionsmenu,context menu,sub menu。options menu就是通过按home键来显示,context menu需要在view上按上2s后显示。这两种menu都有可以加入子菜单,子菜单不能种不能嵌套子菜单。

options menu最多只能在屏幕最下面显示6个菜单选项,成为iconmenu,icon menu不能有checkable选项。多余6的会以more icon menu来调出,成为expanded menu。options menu通过activity的onCreateOptionsMenu来生成,这个函数只会在menu第一次生成时调用。任何想改变options menu的想法只能在onPrepareOptionsMenu来实现,这个函数会在menu显示前调用。onOptionsItemSelected 处理选中的菜单项。

context menu是跟某个具体的view绑定在一起,在activity种用registerForContextMenu来为某个view注册contextmenu。context menu在显示前都会调用onCreateContextMenu来生成menu。onContextItemSelected选中的菜单项。

android还提供了对菜单项进行分组的功能,可以把相似功能的菜单项分成同一个组,这样就可以通过调用setGroupCheckable,setGroupEnabled,setGroupVisible来设置菜单属性,而无须单独设置。

 

 

 

1、利用xml定义选项菜单

a)        options menu通过activity的onCreateOptionsMenu来生成

b)        这个函数只会在menu第一次生成时调用。

                        i.             任何想改变options menu的想法只能在onPrepareOptionsMenu来实现,这个函数会在menu显示前调用。

c)        onOptionsItemSelected 用来处理选中的菜单项。

2、 响应菜单项单击事件

3种方式

menuOptionsSelected

menuItemSelected

onMenuItemClick

3、 动态添加、修改和删除菜单项

菜单项的增删改查

增:add, addSubMenu

删:removeItem,removeGroup

改:

l  选项菜单:onPrepareOptionsMenu()——> MenuItem->setXXX()

l  上下文菜单:onCreateContextMenu(ContextMenu menu, Viewv,ContextMenuInfo menuInfo) {} 方法在每次调用上下文菜单时都会被调用一次

 

一、option Menu

下面用一段很简单的代码来演示option Menu

 

public class MenuTestActivity1 extends Activity implements

      OnMenuItemClickListener {

 

   @Override

   public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

   }

 

   public boolean onCreateOptionsMenu(Menu menu) {

      MenuInflater inflater = this.getMenuInflater();

      inflater.inflate(R.menu.options_menu, menu);

 

      for (int i = 0; i < menu.size(); i++) {

        menu.getItem(i).setOnMenuItemClickListener(this);

      }

 

      return true;

   }

 

   @Override

   public boolean onMenuItemClick(MenuItem item) {

      switch (item.getItemId()) {

      case R.id.newFile:

        // Toast.makeText(this,"new file", Toast.LENGTH_LONG).show();

        break;

      case R.id.exit:

        // Toast.makeText(this,"exit", Toast.LENGTH_LONG).show();

        this.finish();

        break;

      }

 

      return false;

  }

}

当点击退出是按钮式即可产生响应:

 

 

二、sub Menu(子菜单)

 

1、Xml创建

2、动态创建

 

Menu submenu =Menu.addSubMenu(x, x, x, x)

submenu.add()

submenu.add()

main_menu.addSubMenu(x,x,x,x);

或:

getMenuInflater ().inflater(R.menu.submenu, submenu);

 

 

要想实现subMenu只需将上面的OnCreateOptionMenu这个方法的内的代码修改即可:

 

public class MenuTestActivity3 extends Activity {

  

   private static final int SUBMENU  = 10;

   private static final int SUBITEM1 =SUBMENU+1;

   private static final int SUBITEM2 =SUBMENU+2;

   private static final int SUBITEM3 =SUBMENU+3;

  

  

  

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    }

   

    //只在选项菜单第一次显示时调用

    public boolean onCreateOptionsMenu(Menumenu){

      MenuInflaterinflater = this.getMenuInflater();

      inflater.inflate(R.menu.sub_menu,menu);   

                       

      SubMenusubMenu = menu.addSubMenu(1,SUBMENU, 1, "子菜单");

      subMenu.add(20,SUBITEM1,1, "wwww");

      subMenu.add(20,SUBITEM2,2, "subitem2");

     

      subMenu.add(30,SUBITEM3,3, "subitem3");

     

      subMenu.setGroupCheckable(20,true,true);

     

      MenuItemitem = subMenu.getItem(0);

      item.setChecked(true);

     

      subMenu.findItem(SUBITEM3).setCheckable(true);

     

      

      return true;

    }

   

   public boolean onOptionsItemSelected(MenuItem item) {

   switch(item.getItemId()){

   case R.id.menuitem1:

      Toast.makeText(this, "newfile", Toast.LENGTH_LONG).show();

      break;

    case R.id.menuitem2:   

Toast.makeText(this,"exit", Toast.LENGTH_LONG).show();

     

      break;

   case SUBITEM1:

      break;

   case SUBITEM2:

      this.finish();

      break;

   }

  

  

   return true;

}  

}

运行起来的效果图如下:

 

 

三、  上下文菜单 contextmenu:

 

上下文菜单:onCreateContextMenu(ContextMenumenu, View v,ContextMenuInfo menuInfo) {} 方法在每次调用上下文菜单时都会被调用一次

 

 

具体简单的实现代码:

public class MenuTestActivity4 extends Activity {

   public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

 

      TextView tv = (TextView) this.findViewById(R.id.textView);

      this.registerForContextMenu(tv);

   }

 

   @Override

   public boolean onContextItemSelected(MenuItem item) {

     

      switch (item.getItemId()) {

      case R.id.subitem1:

        Toast.makeText(this, "subitem1", Toast.LENGTH_LONG).show();

        break;

      case R.id.subitem2:

        break;

      }

 

      return super.onContextItemSelected(item);

   }

int i=1;

  

   // 每次上下文菜单显示都会调用

   public void onCreateContextMenu(ContextMenu menu, View v,

        ContextMenuInfo menuInfo) {

 

      MenuInflater inflater = this.getMenuInflater();

 

      inflater.inflate(R.menu.sub_menu, menu);

 

      i++;

      menu.getItem(0).setTitle("x"+i);

     

      super.onCreateContextMenu(menu, v, menuInfo);

   }

 

}

 

 

原创粉丝点击