Android中的资源是指非代码部分,如图片、音频、视频、字符等资源。一般我们都是在assets中保存原生的文件,如:MP3文件,Android程序不能直接访问,必须通过AssetManager类以二进制流的形式读取。布局类型文件一般都放在res文件夹下,如:anim,drawable,layout,values,xml,raw,menu等等,这些资源都可以通过R资源类直接访问。assets中的资源很少用到,res中的资源经常用到。
下面我们继续讲解如何使用这些典型布局类型文件:
七、使用菜单(menu)资源:任何视图组件的创建方式都有两种:一种是通过布局文件中声明创建;另一种通过在代码中的创建,菜单也是如此。
Android中的菜单分为选项菜单、上下文菜单和子菜单,都可以在XML文件中声明定义,在代码中通过MenuInflater类使用。
1)典型菜单资源文件结构:
<menu>根元素,在<menu>根元素里面会嵌套<item>、<group>子元素,<item>元素总也可以嵌套<menu>形成子菜单。
2)<menu>根元素没有属性,它包含<item>、<group>子元素
3)<group>表示一个菜单组,相同的菜单可以一起设置其属性,例如visable,enable和checkable等。属性如下:
id:唯一标志该菜单组的引用id。
menuCategory:对菜单进行分类,定义菜单的优先级,有效值为container,system,secondary和alternative。
orderInCategory:一个分类排序整数。
checkableBehavior:选择行为,单选、多选还是其他,有效值为none,all,single。
visable:是否可见,true或者false。
enabled:是否可用,true或者false。
4)<item>表示菜单项,包含在<menu>或<group>中的有效属性。<item>元素的属性如下:
id:唯一标志该菜单组的引用id。
menuCategory:菜单分类。
orderInCategory:一个分类排序整数。title:菜单标题字符串。
titleCondensed:浓缩标题,适合标题太长的时候使用。
icon:菜单的图标。
alphabeticShortcut:字符快捷键。
numberShortcut:数字快捷键。
checkable:是否可选。
checked:是否已经备选。
visable:是否可见。
enabled:是否可用。
案例一:通过menu.xml创建菜单
1)、menu.xml文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:icon="@drawable/ic_launcher" android:title="File"> <menu> <group android:id="@+id/noncheckable_group" android:checkableBehavior="none"> <item android:id="@+id/newFile" android:title="New" android:alphabeticShortcut="n"> </item> <item android:id="@+id/openFile" android:title="Open" android:alphabeticShortcut="o"> </item> <item android:id="@+id/saveFile" android:title="Save" android:alphabeticShortcut="s"> </item> </group> </menu> </item> <item android:title="Edit" android:icon="@drawable/ic_launcher"> <menu> <group android:id="@+id/edit_group" android:checkableBehavior="single"> <item android:id="@+id/cut" android:title="Cut"> </item> <item android:id="@+id/past" android:title="Past"> </item> </group> </menu> </item> <item android:title="Help" android:icon="@drawable/ic_launcher"> <menu> <group android:id="@+id/help_group"> <item android:id="@+id/about" android:title="About"> </item> <item android:id="@+id/exit" android:title="Exit"> </item> </group> </menu> </item> </menu>
test_menu.java文件:
public class Test_Menu extends Activity{ private MenuInflater mi; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test_menu); mi = new MenuInflater(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { mi.inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.about: aboutAlert("本实例演示的是如何使用Xml菜单资源来定义菜单!"); break; case R.id.exit: exitAlert("真的要退出吗?"); break; } return super.onOptionsItemSelected(item); } private void exitAlert(String msg){ //实例化AlertDialog.Builder AlertDialog.Builder builder = new AlertDialog.Builder(this); //设置显示信息 builder.setMessage(msg) .setCancelable(false) //确定按钮 .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 结束Activity finish(); } //取消按钮 }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { return; } }); //创建对话框 AlertDialog alert = builder.create(); //显示对话框 alert.show(); } private void aboutAlert(String msg){ //实例化AlertDialog.Builder AlertDialog.Builder builder = new AlertDialog.Builder(this); //设置显示信息 builder.setMessage(msg) .setCancelable(false) //确定按钮 .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); //创建对话框 AlertDialog alert = builder.create(); //显示对话框 alert.show(); } }
案例二:直接在Activity类中创建菜单:
public class Option_Menu extends Activity { //菜单项ID常量 private static final int Item_Start = Menu.FIRST; private static final int Item_Exit = Menu.FIRST+1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.option_menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, Item_Start, 0, "开始"); menu.add(0, Item_Exit, 0, "退出"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ //菜单项1被选择 case Item_Start: //这只Activity标题 setTitle("开始游戏"); break; //菜单项1被选择 case Item_Exit: setTitle("退出!"); break; } return true; } }