使用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); } }