上下文菜单用到的是事件处理中的回调方式;
而PopupMenu用到的是事件处理中的监听器方式
首先 上下文菜单:
使用XML资源文件定义菜单
menu的XML资源文件中<menu></menu> 代表菜单 <item></item>代表的是项目,装载了多少个菜单或者是菜单中的菜单项<group></group> 用于定义一组菜单项
menu的布局如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/red" android:title="red_title" android:alphabeticShortcut="r"/> <item android:id="@+id/green" android:title="red_title" android:alphabeticShortcut="g"/> <item android:id="@+id/blue" android:title="red_title" android:alphabeticShortcut="b"/> </group> </menu>
详细看代码:
首先需要在你需要用到上下文菜单的布局注册上下文菜单
private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.txt); registerForContextMenu(textView); }
重写创建上下文菜单时触发的方法
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
//加载Menu布局 MenuInflater inflater =new MenuInflater(MainActivity.this); inflater.inflate(R.menu.context,menu); menu.setHeaderTitle("选择背景色"); menu.setHeaderIcon(R.drawable.color); }上下文菜单中菜单项被单击时触发该方法 事件处理机制属于回调方式
@Override public boolean onContextItemSelected(MenuItem item) { item.setChecked(true); switch (item.getItemId()){ case R.id.red: item.setChecked(true); textView.setBackgroundColor(Color.RED); break; case R.id.green: item.setChecked(true); textView.setBackgroundColor(Color.GREEN); break; case R.id.blue: item.setChecked(true); textView.setBackgroundColor(Color.BLUE); break; } return true; }
接下来是PopupMenu:
PopupMenu准确的来说更像是一个方法
首先创建PopupMenu对象 new PopupMenu(Context context , View anchor) anchor代表要激发该弹出窗口的组件 比如这里就是onClick方法里的View
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {
popupMenu = new PopupMenu(MainActivity.this,v);
加载Menu布局 这里和前面的上下文菜单没什么区别, 说起来 菜单布局都需要这一个过程
将菜单资源填充到PopupMenu中 在这里就是我们所创建的PopupMenu对象 popupMenu
MenuInflater inflater = new MenuInflater(MainActivity.this); inflater.inflate(R.menu.popup_menu,popupMenu.getMenu());
为popuMenu绑定事件监听器
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()){ case R.id.exit: popupMenu.dismiss(); break; default: Toast.makeText(MainActivity.this,"单击了"+item.getTitle()+"菜单项",Toast.LENGTH_SHORT).show(); } return true; } }); } });
//显示弹出菜单
popupMenu.show();
最后是ActionBar中显示菜单项:
最为简单 只需要在设置menu资源文件时 加入
android:showAsAction="always|withText"
即可
<item android:showAsAction="always|withText" android:icon="@drawable/tools" android:title="plain_item" android:id="@+id/plain_item"> </item>
然而往往使用ActionBar 不会只用这个功能 如果需要对ActionBar进行操作.那么我们需要创建ActionBar对象 如:
private TextView textView; ActionBar actionBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView= (TextView) findViewById(R.id.txt); actionBar=getActionBar();
//设置是否显示应用程序图标 actionBar.setDisplayShowHomeEnabled(true);
//将应用程序图标设置为可点击的按钮 actionBar.setHomeButtonEnabled(true);
//将应用程序图标设置为可点击的按钮,并在图标上添加向左的箭头 actionBar.setDisplayHomeAsUpEnabled(true); }