我们都知道在Java代码中也可以定义菜单,但是这样会使得代码看起来太过臃肿,并不符合我们编程的一贯原则,所以,Android中也提供了在xml文件中定义菜单。
xml定义菜单不但可以是代码简洁化,并且看起来更加清除容易理解,废话不多说,我们来看下它的一些属性:
首先声明:菜单文件在Android中是有它确定的地方的,就是Android资源文件夹下的Menu文件夹下面,没有的话可以创建一个Android资源文件夹。
在xml文件中,菜单的根元素是<menu></menu>,在其中可以包含<item></item>和<group></group>
在group中可以指定以下属性:
1、checkableBehavior:指定该组菜单的选择行为。可指定为none(不可选),all(多选),single(单选)
2、menuCategory:对菜单进行分类,指定菜单的优先级。值为:container、system、secondary、alternative
3、visible:指定该组菜单是否可见
4、enable:指定该组菜单是否可用
在item中可以定义以下属性:
1、android:id
2、android:title
3、android:icon
4、android:alphabeticShortcut:为菜单指定快捷键
5、android:numericShortcut:为菜单指定数字快捷键
6、android:checkable:设置该菜单项是否可选
7、android:checked:设置该菜单是否已选中
8、android:visible:设置该菜单项是否可见
9、android:enable:设置该菜单项是否可用
下面我们来看个实例:
string.xml
<resources> <string name="app_name">My Application</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="font_size">请选择字号</string> <string name="font_10">10号字体</string> <string name="font_12">12号字体</string> <string name="font_14">14号字体</string> <string name="font_16">16号字体</string> <string name="font_18">18号字体</string> <string name="plain_item">普通菜单项</string> <string name="font_color">请选择颜色</string> <string name="font_red">红色</string> <string name="font_blue">蓝色</string> <string name="font_yellow">黄色</string> </resources>
activity_main.xml
<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=".MainActivity"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
menu_main.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:icon="@drawable/ic_launcher" android:title="@string/font_size"> <menu> <group android:checkableBehavior="single"> <item android:id="@+id/font_10" android:title="@string/font_10"></item> <item android:id="@+id/font_12" android:title="@string/font_12"> </item> <item android:id="@+id/font_14" android:title="@string/font_14"> </item> <item android:id="@+id/font_16" android:title="@string/font_16"> </item> <item android:id="@+id/font_18" android:title="@string/font_18"> </item> </group> </menu> </item> <item android:id="@+id/plain_item" android:title="@string/plain_item"> </item> <item android:title="@string/font_color"> <menu> <group> <item android:id="@+id/font_red" android:title="@string/font_red"> </item> <item android:id="@+id/font_blue" android:title="@string/font_blue"> </item> <item android:id="@+id/font_yellow" android:title="@string/font_yellow"> </item> </group> </menu> </item> </menu>
context.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/red" android:title="@string/font_red" android:alphabeticShortcut="r"> </item> <item android:id="@+id/blue" android:title="@string/font_blue" android:alphabeticShortcut="b"> </item> <item android:id="@+id/yellow" android:title="@string/font_yellow" android:alphabeticShortcut="y"> </item> </group> </menu>
MainActivity.java
package cn.edu.hpu.acm.ui; import android.content.Context; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { private TextView textView; Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.text); registerForContextMenu(textView); context = MainActivity.this; } @Override public void onCreateContextMenu(ContextMenu menu,View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater menuInflater = new MenuInflater(context); menuInflater.inflate(R.menu.context,menu); menu.setHeaderTitle("请选择背景颜色"); menu.setHeaderIcon(R.drawable.ic_launcher); } @Override public boolean onContextItemSelected(MenuItem item) { item.setChecked(true); switch (item.getItemId()){ case R.id.red: item.setChecked(true); textView.setBackgroundColor(Color.RED); break; case R.id.blue: item.setChecked(true); textView.setBackgroundColor(Color.BLUE); break; case R.id.yellow: item.setChecked(true); textView.setBackgroundColor(Color.YELLOW); break; default: break; } return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main,menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.isCheckable()){ item.setChecked(true); } switch (item.getItemId()){ case R.id.font_10: textView.setTextSize(10 * 2); break; case R.id.font_12: textView.setTextSize(12 * 2); break; case R.id.font_14: textView.setTextSize(14 * 2); break; case R.id.font_16: textView.setTextSize(16 * 2); break; case R.id.font_18: textView.setTextSize(18 * 2); break; case R.id.font_red: textView.setTextColor(Color.RED); break; case R.id.font_blue: textView.setTextColor(Color.BLUE); break; case R.id.font_yellow: textView.setTextColor(Color.YELLOW); break; case R.id.plain_item: Toast.makeText(context,"你点击了普通菜单项",Toast.LENGTH_SHORT).show(); break; default: break; } return true; } }