目录
如何创建menu布局文件
在android studio项目中想要添加menu布局文件,无法直接创建,必须先创建一个menu文件夹,先在res文件夹右键,然后如图所示:
然后会出现下面的页面,在Resource type下拉栏选择menu,如下图所示:
接着在menu文件夹下右键,选择如下图所示:
选项菜单(Options Menu)
当用户触发menu项时弹出的菜单
menu->main.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/font_group"
android:orderInCategory="3"
android:title="设置字体大小">
<!--设置子菜单-->
<menu>
<item
android:id="@+id/action_add"
android:title="增大字体">
</item>
<item
android:id="@+id/action_sub"
android:title="减小字体">
</item>
</menu>
</item>
<item
android:id="@+id/action_color"
android:orderInCategory="2"
android:title="设置字体颜色">
</item>
<item
android:id="@+id/action_style"
android:orderInCategory="1"
android:title="设置字体样式">
</item>
</menu>
使用ctrl+F12可以查看menu的简单效果
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
tools:context="com.studio.optionsmenudemo.MainActivity">
<TextView
android:id = "@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="操作字体"
android:textSize="20sp"
/>
</android.support.constraint.ConstraintLayout>
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private TextView tvShow;
private float fontSize = 20.0f;
private static final int ITEMID = 4;// 菜单项id
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvShow = (TextView) findViewById(R.id.tv_show);
tvShow.setTextSize(fontSize);//设置初始字体大小
}
/**
* 表示当activity创建选项菜单时回调的方法
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//MenuInflater inflater = getMenuInflater();
//inflater.inflate(R.menu.main,menu);
//创建菜单的第一种方式 xml文件
getMenuInflater().inflate(R.menu.main, menu);
//创建菜单的代码添加方式
// add(groupId 菜单项分组,ItemId 菜单项唯一标示id,order 表示菜单项的排序,菜单项展示的文本)
menu.add(Menu.NONE, ITEMID, Menu.NONE, "设置字体");
MenuItem item = menu.findItem(R.id.action_style);
//2.快速绑定菜单某一项的方式
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
return false;
}
});
return true;
}
/**
* 绑定Options Menu的事件
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemid = item.getItemId();// 获取当前点击菜单的资源ID
switch (itemid){
case R.id.font_group:
fontSize += 5;
tvShow.setTextSize(fontSize);//设置字体大小
break;
case R.id.action_color:
//随机生成颜色
int red = (int)(Math.random()*256);
int green = (int)(Math.random()*256);
int blue = (int)(Math.random()*256);
tvShow.setTextColor(Color.rgb(red,green,blue));
break;
}
return super.onOptionsItemSelected(item);
}
}
效果,点击竖着的小三点,弹出菜单:
弹出菜单(Popup Menu)
当用户点击某个view视图时弹出的菜单
menu->main.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_font"
android:title="操作字体大小">
<menu>
<item android:id="@+id/action_add" android:title="增大字体"></item>
<item android:id="@+id/action_sub" android:title="减小字体"></item>
</menu>
</item>
<item android:id="@+id/action_backgroud"
android:title="操作背景">
</item>
</menu>
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.studio.popupmenudemo.MainActivity">
<Button
android:id="@+id/btn_top"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点我"
android:textColor="#fff"
android:background="#83b74c"
android:onClick="showMenu"/>
<TextView
android:id="@+id/tvInfo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="#e9e8e9"
android:layout_marginTop="15dp"
android:text="Hello World!"
android:layout_below="@id/btn_top"/>
</RelativeLayout>
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private TextView tviInfo;
private float fontSize = 15.0f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tviInfo = (TextView) findViewById(R.id.tvInfo);
tviInfo.setTextSize(fontSize);
}
/*
点击按钮弹出菜单
*/
public void showMenu(View view) {
//创建PopupMenu对象
PopupMenu popupMenu = new PopupMenu(this, view);
//加载popupMenu xml文件
getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
//表示菜单选项被点击时触发的事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
fontSize += 5;
tviInfo.setTextSize(fontSize);
break;
case R.id.action_sub:
fontSize -= 5;
tviInfo.setTextSize(fontSize);
break;
case R.id.action_backgroud:
int red = (int) (Math.random() * 256);
int green = (int) (Math.random() * 256);
int blue = (int) (Math.random() * 256);
tviInfo.setBackgroundColor(Color.rgb(red, green, blue));
break;
}
return false;
}
});
//显示popupMenu
popupMenu.show();
}
}
注意不要漏掉最后的popupMenu.show()
效果,点击点我view,弹出菜单:
上下文菜单(Context Menu)
用户长按控件时弹出的类似对话框,和上面的Pop Menu是不同的,它需要长按,另外,它出现的位置和点击位置相关
menu->main.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_width"
android:orderInCategory="100"
android:title="获取TextView的宽度">
</item>
<item android:id="@+id/action_height"
android:orderInCategory="101"
android:title="获取Textview的高度">
</item>
</menu>
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
tools:context="com.studio.contextmenudemo.MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击我"
android:layout_centerInParent="true"
android:textColor="#fff"
android:background="#f2c317"
android:textSize="25sp"
android:gravity="center"/>
</RelativeLayout>
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
//注册绑定上下文菜单
registerForContextMenu(tv);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.main,menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.action_width:
setTitle("TextView的宽度是:"+tv.getWidth());//设置标题栏的内容
break;
case R.id.action_height:
setTitle("TextView的高度是:"+tv.getHeight());
break;
}
return super.onContextItemSelected(item);
}
}
效果,长按点击我,弹出菜单,位置和点击位置相关:
针对ListView的每一项绑定上下文菜单
menu->main.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_add"
android:title="Add"
android:orderInCategory="4">
</item>
<item android:id="@+id/action_update"
android:title="Update"
android:orderInCategory="2">
</item>
<item android:id="@+id/action_del"
android:title="Delete"
android:orderInCategory="3">
</item>
</menu>
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
tools:context="com.studio.contextmenulist.MainActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
MainActivity.java:
public class MainActivity extends AppCompatActivity {
private ListView lv;
private List<String> list;
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
list = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
list.add("hgy item" + i);
}
adapter=new ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1,list);
lv.setAdapter(adapter);
//需要绑定listview的上下文菜单
registerForContextMenu(lv);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.main,menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_del://需要将当前的item在listview中移除
AdapterView.AdapterContextMenuInfo menuInfo =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
//获取当前操作的item的下标
int position = menuInfo.position;
list.remove(position);
adapter.notifyDataSetChanged();
break;
}
return super.onContextItemSelected(item);
}
}
效果,长按某一项,会弹出上下文菜单,如下图:
可能有人发现了,Add明明写在最前面,但却显示在最后面,这是因为它们设置了 android:orderInCategory,值越小,越靠前