在Android应用中我们经常会使用菜单功能,而它又分为标准菜单和上下文菜单两种。
1.上下文菜单
注册上下文菜单到给定的VIew ------> void registerForContextMenu(View view);
创建你所要展示的上下文菜单元素 -----> void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo);
菜单点击事件处理 ----> boolean onContextItemSelected(MenuItem item);
2.标准菜单,在版本3.0以上后都和ActionBar一起使用,通过物理功能Menu键可以控制。
创建标准菜单 -----> onCreateOptionsMenu(Menu menu); 该方法只执行一次,2种方式用于创建你所需元素,代码创建和menu.xml引入
在显示菜单前调用 ----> onPrepareOptionsMenu(Menu menu); 用于控制是否显示菜单,修改编辑菜单
菜单点击事件处理 -----> onOptionsItemSelected(MenuItem item);
menu.xml资源需要放在res/menu中
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_add"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/action_bar_add" />
<item android:id="@+id/action_edit"
android:icon="@android:drawable/ic_menu_edit"
android:title="@string/action_bar_edit"
app:showAsAction="always" />
<item android:id="@+id/action_share"
android:icon="@android:drawable/ic_menu_share"
android:title="@string/action_bar_share"
app:showAsAction="ifRoom" />
<item android:id="@+id/action_sort"
android:icon="@android:drawable/ic_menu_sort_by_size"
android:title="@string/action_bar_sort"
app:showAsAction="ifRoom">
<menu>
<item android:id="@+id/action_sort_size"
android:icon="@android:drawable/ic_menu_sort_by_size"
android:title="@string/action_bar_sort_size"
android:onClick="onSort" />
<item android:id="@+id/action_sort_alpha"
android:icon="@android:drawable/ic_menu_sort_alphabetically"
android:title="@string/action_bar_sort_alpha"
android:onClick="onSort" />
</menu>
</item>
</menu>
代码例子:
public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.btn);
// 给Button 注册上下文菜单
registerForContextMenu(btn);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
// 代码创建上下文菜单元素 ,其中itemId是唯一的
menu.add(1, 1, 1, "删除");
menu.add(1, 2, 1, "更新");
menu.add(1, 3, 1, "新增");
// 通过引入menu.xml的方式控制菜单元素
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actions, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
int itemId = item.getItemId();
switch (itemId) {
case 1:
Toast.makeText(getApplicationContext(), "click删除菜单", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(getApplicationContext(), "click更新菜单", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(getApplicationContext(), "click新增菜单", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return super.onContextItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
Log.i("TAG", "onCreateOptionsMenu");
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actions, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
// 这里可以做修改菜单和控制菜单有效
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
}
这样菜单功能就完成。