今天,学习了Android 菜单的实现。
Android提供了三种菜单类型:options menu、contextmenu、sub menu。
optionsmenu(即主菜单),是通过按home键来显示的;contextmenu(右键菜单),是在view上按2s后显示的。两者menu都可以加入sub menu(子菜单),而子菜单不能嵌套菜单。
Android提供了对菜单项进行分组的功能,可以将相似功能的菜单项分为同一组,这就可以通过调用setGroupCheckable、setGroupEnabled、setGroupVisible来设置菜单属性。
下面通过实例来了解Android菜单:
首先,在利用xml定义选项菜单,首先来实现optionsmenu(主菜单)的实现:
<?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>
然后建立Activity.java文件:
package cn.class3g.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.widget.Toast;
public class MenuTestActivity1 extends Activity implements OnMenuItemClickListener{
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);
return true;
}
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:
this.finish();//实现退出
break;
}
return false;
}
}
然后启动Android虚拟机:
Ok,options menu(主菜单)成功实现,这里需要解释的是:options menu通过Activity的onCreateOptionsMenu来生成。且,这个函数只会在menu第一次生成时调用。(注:若想改变options menu的想法只能在onPrepareOptionsMenu来实现,其会在menu显示前调用)onOptionsItemSelected用来处理选中的菜单项。
其次,同样的利用xml来实现contextmenu(右键菜单)的实现:
<?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>
然后在Activity.java文件中实现如下代码:
package cn.class3g.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;
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(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);
MenuItem item = 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, "new file", Toast.LENGTH_LONG).show();
break;
case R.id.menuitem2:
break;
case SUBITEM1:
break;
case SUBITEM2:
this.finish();
break;
}
return true;
}
}
启动Android虚拟机:
点击子菜单,弹出子菜单的菜单项:
Ok,context menu(右键菜单)实现。这里,响应菜单项单击时间的三种方法为:onMenuItemSelected(int featureId, MenuItemitem) 、public boolean onOptionsltemSelected(Menultemitem)、onMenuItemClick
然后,利用xml来实现sub menu(子菜单)的实现:
<?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>
然后在Activity.java文件中实现如下代码:
package cn.class3g.activity;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
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);
}
// 每次上下文菜单显示都会调用
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);
}
}
启动Android虚拟机:
按住上边那句英文2s,弹出菜单项:
注意:这里一定得留意了,每创建一个Activity.java文件一定要在AndroidManifest.xml文件中注册。