原CSDN博客已弃用,文章会逐渐迁移过来。
使用XML文件定义菜单资源的好处
1、有利于观察菜单结构
2、菜单资源和逻辑代码分离,有利于维护
3、菜单资源可以被不同的平台、版本等所用
Menu菜单的创建方式:
一、使用XML方式创建:
1.在res上面右键->New->Android resource directory
2.点击之后,出现下图Resource type选择menu,名字随便起,点击ok
3.可以看到菜单栏已经出现了menu
4.menu上面右击,如下图选择:
5.file name自己随便起,点击ok
6.可以看到menu文件夹下,有一个main.XML文件,main是我起的文件名
7.打开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:title="设置字体大小"
android:orderInCategory="3">
</item>
<item android:id="@+id/action_color"
android:title="设置字体颜色"
android:orderInCategory="1">
</item>
<item android:id="@+id/action_style"
android:title="设置字体样式"
android:orderInCategory="2">
</item>
</menu>
<!--
android:id="@+id/font_group" 设置当前菜单项的唯一标识
android:title="设置字体大小" 设置菜单项的文本
android:orderInCategory="3" 设置同种类菜单项的排列顺序
-->
8.再打开Activity.java文件,在里面重载onCreate()函数
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
/**
* 演示OptionMenu的使用
*/
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=findViewById(R.id.tv_show);
tvShow.setTextSize(fontSize);//设置textView中初始的字体大小
}
/**
* 表示当activity创建选项菜单时回调的使用
* @param menu
* @return
* true 用来显示菜单项
* false 无法显示菜单项
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// MenuInflater inflater = getMenuInflater();
// inflater.inflate(R.menu.main,menu);
//创建菜单的第一种方式,xml文件
getMenuInflater().inflate(R.menu.main,menu); //第一个参数是资源文件,第二个参数是menu对象
}
/**
* 表示当选项菜单中的item被选中时回调的方法
* @param item 表示菜单项对象
* @return
*/
@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);
}
}
9.activity_main的代码如下
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置字体"
android:textSize="20dp"/>
</RelativeLayout>
二、使用Java代码添加菜单的方法
.activity_main如上不变
在Java代码的onCreateOptionsMenu()方法中添加以下代码,即可为Menu菜单动态添加相应的菜单项
//add(groupId 菜单项分组 ,ItemId 菜单项唯一标识id,order 表示菜单项的排序,菜单项展示的文本)
menu.add(Menu.NONE,ITEMID,Menu.NONE,"设置字体");
Java文件代码如下:
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
/**
* 演示OptionMenu的使用
*/
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=findViewById(R.id.tv_show);
tvShow.setTextSize(fontSize);//设置textView中初始的字体大小
}
/**
* 表示当activity创建选项菜单时回调的使用
* @param menu
* @return
* true 用来显示菜单项
* false 无法显示菜单项
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//add(groupId 菜单项分组 ,ItemId 菜单项唯一标识id,order 表示菜单项的排序,菜单项展示的文本)
menu.add(Menu.NONE,ITEMID,Menu.NONE,"设置字体");
return true;
}
/**
* 表示当选项菜单中的item被选中时回调的方法
* @param item 表示菜单项对象
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//本方法内的使用参照上述xml写法的实现方法即可
return super.onOptionsItemSelected(item);
}
}
三、让Activity继承Activity的方法
将Activity原本继承的AppCompatActivity改成继承Activity
重写onMenuItemSelected方法
/**
* 表示菜单项中被点击回调的方法
* @param featureId
* @param item
* @return
*/
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
int itemId = item.getItemId();
if(itemId==ITEMID){
tvShow.setText("调用了菜单项第二种点击事件");
}
return super.onMenuItemSelected(featureId, item);
}
有的小朋友会问,if(itemId==ITEMID)的这个ITEMID是什么,其实,这个数值是可以直接填一个菜单项ID的,这里写ITEMID是因为完整的代码的上面写了一句, private static final int ITEMID=4;//菜单项的ID
四、处理菜单项的第四种方式,在onCreateOptionsMenu()方法内添加监听事件
/**
* 表示当activity创建选项菜单时回调的使用
* @param menu
* @return
* true 用来显示菜单项
* false 无法显示菜单项
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem item=menu.findItem(R.id.action_style);
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_LONG).show();
return false;
}
});
return true;
}
菜单内还可以添加子菜单,如在菜单文件main下
<item android:id="@+id/font_group"
android:title="设置字体大小"
android:orderInCategory="3">
<!--设置子菜单-->
<item android:id="@+id/action_add" android:title="增大字体"></item>
<item android:id="@+id/action_sub" android:title="减小字体"></item>
</item>
那么如何给子菜单获得绑定事件呢
直接在绑定事件监听的方法里(如onOptionsItemSelected()方法),找到对应的资源ID即可
case R.id.action_add:
fontSize += 5;
tvShow.setTextSize(fontSize);
break;
附上完整的Java代码
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
/**
* 演示OptionsMenu的使用
*/
public class MainActivity extends Activity {
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);//设置textview中初始的字体大小
}
/**
* 表示当activity创建选项菜单时回调的方法
* @param menu
* @return
* true 用来显示菜单项
* false 无法显示菜单项
*/
@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);
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;
}
/**
* 表示当选项菜单中的item被选中时回调的方法
* @param item 表示菜单项对象
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId=item.getItemId();//获取当前点击菜单项的资源id
switch (itemId){
case R.id.action_add://点击设置字体大小
fontSize+=5;
tvShow.setTextSize(fontSize);
break;
case R.id.action_sub:
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);
}
/**
* 表示菜单项中被点击回调的方法
* @param featureId
* @param item
* @return
*/
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
int itemId=item.getItemId();
if(itemId==ITEMID){
tvShow.setText("调用了菜单项第二种点击事件");
}
return super.onMenuItemSelected(featureId, item);
}
}