用户按下menu按钮后,弹出一个菜单,可以设置例如背景音乐,或者显示提示等功能选项.
(1) 需要几个要用到的string
res/values/strings.xml
Settings...
Game Settings
s
Music
Play background music
Hints
Show hints during play
(2) 定义菜单,需要建立新的文件
res/menu/menu.xml
android:id="@+id/settings"
android:title="@string/settings_label"
android:alphabeticShortcut="@string/settings_shortcut" />
解释: alphabeticShortcut = "s"意思是 快捷键为 键盘的"s"
(3) 在需要添加menu的Activity中重写onCreateOptionsMenu()方法:
@override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
解读代码:首先, MenuInflater获取方法只有一种: Activity.getMenuInflater(),其次, MenuInflater.inflater(int menuRes,Menu menu)的返回值是void型(这里不代表inflater就是static方法,可以这样调用,只是为了描述方便),这就决定了MenuInflater.inflater后就没有后续操作了.这说明通过这种方式把Menu布局文件写好后就不能在程序中动态修改了,而不像LayoutInflater.inflater那样,返回值是View型,可以进行后续的进一步操作.另外, MenuInflater只有一个void inflater(int menuRes,Menu menu)非构造方法.
getMenuInflater() 方法返回一个MenuInflater类的实例,用于从xml文件中读取菜单定义,并将其转换为实际的视图.
用户选择任何菜单项时,将会调用onCreateOptionsItemSelected()方法,该方法的定义如下:
@Override
public boolean onCreateOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.settings:
startActivy(new Intent(this, Settings.class));
return true;
}
return flase;
}
Settings是一个类,后面给出!用来显示所有用户首选项并允许用户修改这些首选项的值.
(4) 添加设置,新建一个xml文件
res/xml/settings.xml
xmlns:android="http://schemas.android.com/apk/res/android">
android:key="music"
android:title="@string/music_title"
android:summary="@string/music_summary"
android:defaultValue="true" />
android:key="music"
android:title="@string/music_title"
android:summary="@string/music_summary"
android:defaultValue="true" />
创建两个checkbox并设置初始状态为开启,因为这两个首选项的键值都是字符串常量,将被存储在android的首选项数据库中.
(5) 创建并定义Settings类,继承PreferenceActivity类:
public class Settings extends PreferenceActivity{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferecesFromResource(R.xml.settings);
}
}
addPreferecesFromResource() 方法从xml文件中读取设置定义,并将其解压缩到当前的活动视窗中,所有耗时的解压缩都在PreferenceActivity类中处理.
(6) 注册Setting活动就完成了整个例子