您的位置:首页 > 移动开发 > Android开发

Android--菜单详解

2016-09-05 19:54 363 查看
Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单。

选项菜单:

一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种。最常用的是干版本创建,所以这里着重高版本的创建方式的介绍。

创建步骤:

1, 在res/menu/文件夹中xml 中定义每个菜单项

<item

 android:id =" 菜单中每个Item的id"

 android:title="每个Item 文本信息"

 android:orderInCategory :Menu中显示的顺序,数字越小, 越在前面显示, 如果数字一样, 先写那个  那个就在前面位置显示

  android:showAsAcrtion:设置Menu何时和怎样显示在Action Bar中。

   其中属性值:never  :   永远都不显示在Action Bar中

    always :   一直显示在Action Bar中

    ifRoom :   如果有空间 则显示在Action Bar中
/>

2, 在activity中 显示菜单项

重写父类的方法:

onCreateOptionsMenu(Menu menu)
{
//加载菜单
getMenuInflater.inflat(R.menu.main,menu);
}

3, 在activity中 每个菜单项实现点击
重新父类的方法:
onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
 case R.id.action_red:
.......
 break;
}
}

低版本创建: 
//低版本的创建
/**
* groupId
分组ID
* itemId   菜单项的Id
* order    排序
* title    菜单显示的文字
*/
menu.add(menu.NONE, MENU_ONE, menu.NONE, "代码创建的菜单");

//带有子菜单的一级菜单
SubMenu subMenu = menu.addSubMenu(menu.NONE, 2, menu.NONE, "sub 1");
subMenu.add(menu.NONE, 21, 1, "sub 1-1");
subMenu.add(menu.NONE, 22, 2, "sub 1-2");
subMenu.add(menu.NONE, 23, 0, "sub 1-3");

实例:public class MainActivity extends Activity {
private TextView t;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
t = (TextView) findViewById(R.id.t);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.red:
t.setTextColor(Color.RED);
t.setTextSize(12);
break;
case R.id.green:
t.setTextColor(Color.GREEN);
t.setTextSize(22);

break;
case R.id.blue:
t.setTextColor(Color.BLUE);
t.setTextSize(32);
break;
}
return super.onOptionsItemSelected(item);
}
<item
android:id="@+id/ACTION_COLOR"
android:title="选择颜色">
<menu >
<group >
<item
android:id="@+id/red"
android:title="红色" />
<item
android:id="@+id/green"
android:title="绿色" />
<item
android:id="@+id/blue"
android:title="蓝色" />
</group>
</menu>
</item>

上下文菜单:
ContextMenu 和OptionsMenu的区

1,  OptionsMenu 的拥有者是Activity;  ContextMenu 上下文菜单的拥有者是Activity中View

2,  每个Activity中有且只有一个OptionsMenu,它为整个Activity服务;  每个Activity中可以有多个View, 那个View需要显示上下文菜单 需要为该View注册上下文菜单registerForContextMenu(View  view);
创建方式
1, 注册上下文菜单
2, res/menu/文件中的  创建每个Item项
3, 重写父类方法:  onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo)
/**
* 当长按View时调用

* ContextMenu menu
   需要显示的上下文菜单
* View v
   用户选择的View
* ContextMenuInfo menuInfo 所选择界面的额外信息
*      (Spinner,ListView,GridView)
*      携带这AdapterView 的 posotion信息
--菜单可见--
4, 实现菜单项的点击: 重写父类的方法:  onContextItemSelected(MenuItem  item)

实例:

public class MainActivity extends Activity {
private ListView lv;
private List<String> data = new ArrayList<String>();
private ArrayAdapter<String> adapter;
private int position = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
for (int i = 0; i < 20; i++) {
data.add("Item --->" + i);
}
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, data);
lv.setAdapter(adapter);
// 1, 注册上下文对象
registerForContextMenu(lv);
}
// 2, 在res/menu/中创建菜单项
// 3, 重写父类的方法, 实现显示
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// 加载菜单页面
getMenuInflater().inflate(R.menu.main, menu);
// 获取当前选中ListView的Item的下标
position = ((AdapterContextMenuInfo) menuInfo).position;
}
// 4, 重写父类的方法, 实现每个菜单项的点击
@Override
public boolean onContextItemSelected(MenuItem item) {

switch (item.getItemId()) {
case R.id.action_delete:
// 从数据源中移除数据
data.remove(position);
// 刷新适配器
adapter.notifyDataSetChanged();
break;
}
return super.onContextItemSelected(item);
}
}
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
android:id="@+id/action_delete"
android:orderInCategory="100"
android:showAsAction="never"
android:title="删除信息"/>

</menu>

弹出菜单:

Popup Menu    弹出式菜单      Api 必须在11以上,  可以为任意View 创建弹出式菜单

  1, 得到PopupMenu的对象

   PopupMenu pMenu = new PopupMenu(this,位置参考的UI控件);
  2, 加载菜单

   getMenuInflater.inflat(R.menu.main,menu);
  3, 为PopupMenu设置监听器

  pMenu.setOnMenuItemClickListener(.....);
  4, 显示菜单

  pMenu.show();

实例:

public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
}
// 点击按钮弹出菜单
public void change(View v) {
// 得到popup对象
PopupMenu popupMenu = new PopupMenu(MainActivity.this, v);
// 加载菜单
getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
// 为 popup设置监听器
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.action_color:
tv.setTextColor(Color.CYAN);
break;
case R.id.action_size:
tv.setTextSize(20);
break;
}
return false;
}
});
// 显示
popupMenu.show();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: