菜单:
只有按手机的菜单键才会弹出来,有Menu,SubMenu,MenuItem3个类。在public boolean onCreateOptionsMenu(Menu menu);这个函数构造菜单,当选中一个菜单项的时候就会到public boolean onOptionsItemSelected(MenuItem item);函数中处理。
当一个子菜单有多个菜单项的时候就会像对话框一样弹出多个菜单项,那个对话框的顶部可以设置文字和Icon,下面是一段示例:
SubMenu fontmenu=menu.addSubMenu("字体大小");
fontmenu.setHeaderIcon(R.drawable.ic_launcher);
fontmenu.setHeaderTitle("设置字体大小");
fontmenu.add(0, FONT_10, 0, "10号字");
fontmenu.add(0, FONT_12, 0, "12号字");
fontmenu.add(0, FONT_14, 0, "14号字");
fontmenu.add(0, FONT_16, 0, "16号字");
那个groupid暂时还不清楚,书也没说,order我猜就是菜单项的顺序,设为0就按照你代码的先后顺序了,第二个参数是菜单项的id.
接着处理菜单项的响应函数:
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case FONT_10:
editText.setTextSize((float) (20));break;
case FONT_12:
editText.setTextSize((float) (24));break;
case FONT_14:
editText.setTextSize((float) (28));break;
case FONT_16:
editText.setTextSize((float) (32));break;
ContextMenu-----上下文菜单,当长按一个组件就会弹出来的菜单叫上下文菜单。它是Menu的子类,所以那些add()也同样可用,它是在
public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo);里面构造,菜单项的响应在
public boolean onContextItemSelected(MenuItem item)里面。
例子如下:
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
// TODO Auto-generated method stub
menu.add(0, COLOR_RED, 0, "red");
menu.add(0, COLOR_GREEN, 0, "green");
menu.add(0, COLOR_BLUE, 0, "blue");
super.onCreateContextMenu(menu, v, menuInfo);
}
public boolean onContextItemSelected(MenuItem item)
{
// TODO Auto-generated method stub
switch(item.getItemId())
{
case COLOR_RED:
show.setTextColor(Color.RED);break;
case COLOR_GREEN:
show.setTextColor(Color.GREEN);break;
case COLOR_BLUE:
show.setTextColor(Color.BLUE);break;
default:
break;
}
return true;
}
除此之外,一个做好了的ContextMenu还要和一个View组件绑定在一起,那个组件长按才会弹出ContextMenu的:
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText=(EditText)findViewById(R.id.edit);
show=(TextView)findViewById(R.id.show);
registerForContextMenu(show);
}
用XML写菜单:
菜单资源位于res/menu中,就3个标签<menu>,<item>,<group>,<item>代表的就是菜单项了,<item>里面可以加<menu>形成子菜单,<group>把一组<item>包含起来,形成一个小组。下面是上面的示例的XML化:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:title="字体大小"
android:icon="@drawable/ic_launcher">
<menu >
<group android:checkableBehavior="single">
<item
android:id="@+id/font_10"
android:title="10号字" />
<item
android:id="@+id/font_12"
android:title="12号字" />
<item
android:id="@+id/font_14"
android:title="14号字" />
<item
android:id="@+id/font_16"
android:title="16号字" />
</group>
</menu>
</item>
<item
android:id="@+id/plain"
android:title="普通菜单项"/>
<item
android:title="字体颜色">
<menu >
<item
android:id="@+id/color_red"
android:title="红色"/>
<item
android:id="@+id/color_green"
android:title="绿色"/>
<item
android:id="@+id/ccolor_blue"
android:title="蓝色"/>
</menu>
</item>
</menu>
而在java代码中通过MenuInflater的inflate函数把资源和menu联系起来:
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater=new MenuInflater(this);
inflater.inflate(R.menu.my_menu, menu);
return super.onCreateOptionsMenu(menu);
}
public boolean onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
case R.id.font_10:
editText.setTextSize((float) (20));item.setChecked(true);break;
case R.id.font_12:
editText.setTextSize((float) (24));item.setChecked(true);break;
case R.id.font_14:
editText.setTextSize((float) (28));item.setChecked(true);break;
case R.id.font_16:
editText.setTextSize((float) (32));item.setChecked(true);break;
case R.id.color_red:
editText.setTextColor(Color.RED);break;
case R.id.color_green:
editText.setTextColor(Color.GREEN);break;
case R.id.ccolor_blue:
editText.setTextColor(Color.BLUE);break;
default:
break;
}
return true;
}
PopupMenu:会在组件的下方弹出来的菜单
主要3个步骤:1建立PopupMenu对象,第二个参数是激发该菜单出现的组件,2利用inflate函数把菜单资源填充到popupmenu中,3show()出来
btn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub
popupMenu=new PopupMenu(MainActivity.this, btn);
getMenuInflater().inflate(R.menu.my_popupmenu, popupMenu.getMenu());
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener()
{
@Override
public boolean onMenuItemClick(MenuItem arg0)
{
// TODO Auto-generated method stub
if(arg0.getItemId()==R.id.click_me)
{
Toast toast=Toast.makeText(MainActivity.this, "多手", Toast.LENGTH_SHORT);
toast.show();
}
else if(arg0.getItemId()==R.id.exit)
{
popupMenu.dismiss();
}
return false;
}
});
popupMenu.show();
}
});