Android菜单功能的实现

来源:互联网 发布:斗鱼人气软件 2016 编辑:程序博客网 时间:2024/06/05 14:46

android提供了三种菜单类型,分别为

1) options menu

2) context menu

3) sub menu

options menu就是通过按home键来显示,context menu需要在view上按上2s后显示。这两种menu都有可以加入子菜单,子菜单不能种不能嵌套子菜单。

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

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

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

1、利用xml定义选项菜单

options menu通过activityonCreateOptionsMenu来生成

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

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

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

2、响应菜单项单击事件

3种方式

onMenuItemSelected

onOptionsltem Selected

onMenuItemClick

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

菜单项的增删改查

增:add, addSubMenu

删:removeItemremoveGroup

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

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

4、子菜单的创建

l Xml创建

l 动态创建

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

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

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

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

或:

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

5、带单选或复选的子菜单

public boolean onCreateOptionsMenu(Menu menu){

     MenuInflater inflater=this.getMenuInflater();

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

    

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

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

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

    

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

    

     subMenu.setGroupCheckable(20, true, true);//单选框

     //subMenu.getItem().setCheckable(true);//复选框

    

     MenuItem item=subMenu.getItem(0);//设置默认选项的第几个

     //item.setCheckable(true);//设置默认选项

     item.setChecked(true);

    

     return true;

    }

6、上下文子菜单

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);

}

7、利用今天所学知识实现android系统中通讯录界面中所用到的菜单

MenuMyTestActivity.java

public class MenuMyTestActivity extends Activity {

 

private static final int DELETE=1;

private static final int EXIT=2;

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;

Menu menu=null;

 public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        

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

        this.registerForContextMenu(tv);

    }

    

 

    public boolean onCreateOptionsMenu(Menu menu){

     menu.add(1, DELETE, 2, "删除保存");

     menu.add(1, EXIT , 3, "退出");

     this.menu=menu;

    

     SubMenu subMenu=menu.addSubMenu(1, SUBMENU, 1, "新建联系人");

    

     subMenu.add(20, SUBITEM1,1,"手机");

     subMenu.add(20, SUBITEM2,2,"电话");

     subMenu.add(30, SUBITEM3,3,"生日提醒");

     menu.findItem(SUBMENU).setIcon(R.drawable.ic_launcher);

     menu.findItem(DELETE).setIcon(R.drawable.ic_launcher);

     menu.findItem(EXIT).setIcon(R.drawable.ic_launcher);

    

     subMenu.setGroupCheckable(20, true, true);

    

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

     MenuItem item=subMenu.getItem(0);

     item.setCheckable(true);//可选或互斥

     item.setChecked(true);//选中状态

    

     return true;

    }

    

    @Override

public boolean onContextItemSelected(MenuItem item) {

switch(item.getItemId()){

case R.id.subitem1:

Toast.makeText(this, "添加到群组", Toast.LENGTH_LONG).show();

break;

case R.id.subitem2:

Toast.makeText(this, "编辑联系人", Toast.LENGTH_LONG).show();

break;

}

return super.onContextItemSelected(item);

}

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

public void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {

MenuInflater inflater=this.getMenuInflater();

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

super.onCreateContextMenu(menu, v, menuInfo);

}

    

    

    int i=1;

    public boolean onOptionsItemSelected(MenuItem item) {

switch(item.getItemId()){

case DELETE:

menu.removeGroup(1);

break;

case EXIT:

this.finish();

break;

case SUBITEM1:

break;

case SUBITEM2:

break;

case SUBITEM3:

this.finish();

break;

}

return true;

}

}

Main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" >

    <TextView

        android:id="@+id/textView"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="@string/hello" />

</LinearLayout>

Options_menu.xml

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

     <item android:id="@+id/newFile"

    android:icon="@drawable/ic_launcher"

    android:title="@string/newFile_title" 

   />

<item android:id="@+id/exit"

    android:icon="@drawable/ic_launcher"

    android:title="@string/exit_title" 

    />

    

</menu>

Sub_menu.xml

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@+id/menuitem1"

    android:title="menuitem1" 

    />

    

<item android:id="@+id/menuitem2"

    android:title="menuitem2" >

<menu>

    <item android:id="@+id/subitem1"

        android:title="subitem1"   

        />

    <item android:id="@+id/subitem2"

        android:title="subitem2"   

        />

    

</menu>

</item>

</menu>

MenuMyTest Manifest

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="cn.class3g.activity"

    android:versionCode="1"

    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name" >

        <activity

            android:label="@string/app_name"

            android:name=".MenuMyTestActivity" >

            <intent-filter >

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

</manifest>

显示结果图:

点住“欢迎来到我的android世界!”弹出下图

点击menuitem2出现下图:

点击subitem1出现下图:

单击手机上的menu按钮,出现下图:

单击“新建联系人”图标,出现下图: