Android UI基础之Menu 的使用
在Android中一共有三种类型的菜单,它们分别是
1:Options menu and action bar (菜单在标题栏)
2:Context menu (上下文菜单)
3:Popup menu (弹出式菜单)
Options menu and action bar 的实现如下:
效果图如下:
点击生成图标效果如下:
对于menu的定义一共有两种方式,分别为xml 注册与代码注册
代码注册如下:
1: 创建Activity的onCreateOptionMenu (Menu menu) 方法,当菜单第一次被第一次打开时调用
2:调用Menu 的add ()方法添加菜单项(MenuItem),同时可以调用MenuItem的SetIcon ()方法来为菜单项设置图标。
3:当菜单项 (MenuItem )被选择时,覆盖Activity的nOptionsItemSelected(MenuItem item) 来响应事件。
public boolean onCreateOptionsMenu(Menu menu) {
// // 添加菜单项参数分别为(组ID , 当前选项ID, 排序, 标题)
menu.add(0, 100, 1, "设置");// 返回值为menuItem
menu.add(0, 200, 2, "开始游戏");
menu.add(0, 300, 3, "退出游戏");
return super.onCreateOptionsMenu(menu);
}
// 菜单选项的单击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//在onCreateOptionsMenu方法中,如果单击那个 menuItem则返回其对应的ItemId
int id = item.getItemId();// 返回当前对应的Item的id
switch (id) {
case 100://表示在戏设置中选项中进行的操作,此处为实现代码
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("请选择一个平台使用");
final String[] items = {"Android", "ios", "Wp"};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
}
});
builder.show();
break;
case 200:
Toast.makeText(MainActivity.this, "正在启动游戏界面。。。", Toast.LENGTH_SHORT).show();
break;
case 300:
Toast.makeText(MainActivity.this, "正在关闭游戏。。。。。", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
Xml 文件注册与上基本类似
效果如下:
实现过程如下:
需要在res/ menu 文件夹下创建文件
main_mian2.xml 用来添加菜单的每一项布局 如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/game_start"
android:orderInCategory="300"
android:title="开始游戏"
app:showAsAction="ifRoom"
android:icon="@android:drawable/ic_menu_edit"
/>
<item
android:id="@+id/game_exit"
android:orderInCategory="200"
android:title="退出游戏"
app:showAsAction="ifRoom"
android:icon="@android:drawable/ic_menu_camera"
/>
/>
<item
android:id="@+id/game_set"
android:orderInCategory="100"
android:title="游戏设置"
app:showAsAction="ifRoom"
android:icon="@android:drawable/ic_menu_search"
/>
/>
</menu>
在MianActivity 文件中将使用getMenuInflater().inflate(R.menu.mian_main2,menu); 将资源问件加载出来即可。
完整代码如下:
public class MainActivity extends ActionBarActivity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 用于创建选项项菜单的事件方式,在打开界面的时时候会被自动调用
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.mian_main2,menu);
return super.onCreateOptionsMenu(menu);
}
// 菜单选项的单击事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//在onCreateOptionsMenu方法中,如果单击那个 menuItem则返回其对应的ItemId
int id = item.getItemId();// 返回当前对应的Item的id
switch (id) {
// ----------------------------------xml文件注册---------------------
case R.id.game_start:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("请选择一个平台使用");
final String[] items = {"Android", "ios", "Wp"};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
}
});
builder.show();
break;
case R.id.game_exit:
Toast.makeText(MainActivity.this, "正在启动游戏界面。。。", Toast.LENGTH_SHORT).show();
break;
case R.id.game_set:
Toast.makeText(MainActivity.this, "设置游戏。。。", Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}
ContextMenu的使用
ContextView,与上下文环境有关,思想类似于Windows 中的右击单击建弹出的快捷菜单,操作是长时间按住某个组件不放
效果如下:
长时间按住如下:
创建步骤如下:
1覆盖Activity的 onCreateContextMenu ()方法,调用Menu 的add ()方法添加菜单项
2:覆盖Activity的onContextItemSelected(MenuItem item) 来响应事件。
3:调用registForContextMenu ()方法来为视图注册上下文菜单。
注意:一个界面只能使用一个ContenxtMenu。
ContextMenu也有两种注册方式。
Xml 注册方式实现过程如下:
在res/menu 文件夹下创建 context_menu.xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/red"
android:orderInCategory="100"
android:title="红色" />
<item
android:id="@+id/green"
android:orderInCategory="200"
android:title="绿色" />
<item
android:id="@+id/blue"
android:orderInCategory="300"
android:title="蓝色" />
</menu>
在MianActivity文件中加载布局文件。
package com.xiyou.com.meanususe;
import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
//上下文菜单
public class ContextMenuus extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.context_menu);
// 注册上下文菜单到TextView组件上
registerForContextMenu(tv);
}
// 创建上下文菜单的事件方法
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.context_menu, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
// 上下文菜单的单击事件
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.red:
tv.setBackgroundColor(Color.RED);
break;
case R.id.green:
tv.setBackgroundColor(Color.GREEN);
break;
case R.id.blue:
tv.setBackgroundColor(Color.BLUE);
break;
}
return super.onContextItemSelected(item);
}
}
PopupMenu 的使用
弹出式菜单是停靠在View上的一个模式菜单,如果View对象的下方有空间,那么弹出菜单将显示在停靠对象的下方,否则会显示在上方,这个组件非常有用。
注意:弹出式菜单是在API 11 或更高版本上才有效的
效果图如下:
实现过程如下:
实现过程如下:
需要在res/ menu 文件夹下创建文件
poup_menu.xml 用来添加菜单的每一项布局 如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/s"
android:orderInCategory="100"
android:title="S" />
<item
android:id="@+id/m"
android:orderInCategory="200"
android:title="M" />
<item
android:id="@+id/l"
android:orderInCategory="300"
android:title="L" />
</menu>
在MainActivity中加载菜单项,并且添加监听事件
/*
弹出式菜单
在实现OnMenuItemClickListener方法时应该实现PopupMenu中的方法
*/
public class Poupmenu_use extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_poupmenu_use);
}
public void TypeSize_Click(View view) {
PopupMenu popupMenu = new PopupMenu(this, view);
MenuInflater inflater = popupMenu.getMenuInflater();
inflater.inflate(R.menu.poup_menu, popupMenu.getMenu());
// 弹出式菜单的选项单击事件
popupMenu.setOnMenuItemClickListener(this);
popupMenu.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
String s = (String) item.getTitle();// 获取MenuItem上的内容
switch (item.getItemId()) {
case R.id.s:
Toast.makeText(Poupmenu_use.this, "你选择的是S"+s, Toast.LENGTH_SHORT).show();
break;
case R.id.m:
Toast.makeText(Poupmenu_use.this, "你选择的是M", Toast.LENGTH_SHORT).show();
break;
case R.id.l:
Toast.makeText(Poupmenu_use.this, "你选择的是L", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}