Android开发:菜单、弹窗消息与活动生命周期处理
立即解锁
发布时间: 2025-08-24 00:47:47 阅读量: 1 订阅数: 4 

### Android开发:菜单、弹窗消息与活动生命周期处理
#### 1. 菜单的应用
在Android开发中,菜单的使用是一项重要的功能。我们可以通过XML文件来描述菜单,并在需要时将其“膨胀”为实际的菜单对象,这样能将菜单结构与菜单处理逻辑的实现分离,还便于开发菜单编辑工具。
##### 1.1 菜单XML结构
菜单XML文件存放在项目树的`res/menu/`目录下,和项目可能使用的其他类型资源放在一起。就像布局文件一样,项目中可以有多个菜单XML文件,每个文件都有自己的文件名,并且以`.xml`为扩展名。
以下是一个名为`option.xml`的菜单示例:
```xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/add"
android:title="Add"
android:icon="@drawable/ic_menu_add" />
<item android:id="@+id/reset"
android:title="Reset"
android:icon="@drawable/ic_menu_refresh" />
</menu>
```
菜单XML文件的结构规则如下:
- 必须以`<menu>`根元素开始。
- `<menu>`元素内包含`<item>`元素和`<group>`元素,`<group>`元素代表一组可以作为一个整体操作的菜单项。
- 子菜单通过在`<item>`元素下添加`<menu>`元素来指定,用这个新的`<menu>`元素描述子菜单的内容。
- 如果想检测菜单项何时被选中,或者从Java代码中引用菜单项或组,一定要设置`android:id`属性,就像在视图布局XML中一样。
##### 1.2 菜单选项与XML
在`<item>`和`<group>`元素中,可以指定各种选项,这些选项与`Menu`或`MenuItem`上的相应方法匹配,具体如下:
| 选项 | 说明 |
| ---- | ---- |
| 标题(Title) | 菜单项的标题通过`<item>`元素的`android:title`属性提供,可以是一个文字字符串,也可以是对字符串资源的引用(例如`@string/foo`)。 |
| 图标(Icon) | 菜单项可以有图标,通过`<item>`元素的`android:icon`属性以对可绘制资源的引用形式提供(例如`@drawable/eject`)。 |
| 顺序(Order) | 默认情况下,菜单中菜单项的顺序由它们在菜单XML中出现的顺序决定。可以通过在`<item>`元素上指定`android:orderInCategory`属性来更改顺序,这是一个基于0的索引,表示与当前类别关联的菜单项的顺序。有一个隐式的默认类别,组可以通过`android:menuCategory`属性为该组中的菜单项指定不同的类别。不过,通常最简单的方法是将菜单项按希望显示的顺序放在XML中。 |
| 启用状态(Enabled) | 菜单项和组可以启用或禁用,在XML中通过`<item>`或`<group>`元素的`android:enabled`属性控制。默认情况下,菜单项和组是启用的。禁用的菜单项和组会显示在菜单中,但不能被选中。可以在运行时通过`MenuItem`的`setEnabled()`方法更改菜单项的状态,或者通过`Menu`的`setGroupEnabled()`方法更改组的状态。 |
| 可见状态(Visible) | 菜单项和组可以可见或不可见,在XML中通过`<item>`或`<group>`元素的`android:visible`属性控制。默认情况下,菜单项和组是可见的。不可见的菜单项和组不会显示在菜单中。可以在运行时通过`MenuItem`的`setVisible()`方法更改菜单项的状态,或者通过`Menu`的`setGroupVisible()`方法更改组的状态。 |
| 快捷键(Shortcut) | 菜单项可以有快捷键,即单个字母(`android:alphabeticShortcut`)或数字(`android:numericShortcut`),按下这些键可以选择菜单项,而无需使用触摸屏、方向键或轨迹球来导航整个菜单。 |
##### 1.3 菜单的膨胀
一旦在XML中定义了菜单,实际使用它就很简单,只需创建一个`MenuInflater`并让它膨胀你的菜单即可。
以下是一个将菜单创建转换为使用菜单XML资源和`MenuInflater`的示例:
```java
@Override
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(this).inflate(R.menu.option, menu);
return(super.onCreateOptionsMenu(menu));
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
new MenuInflater(this).inflate(R.menu.context, menu);
}
```
这里,`MenuInflater`将菜单资源(如`R.menu.option`)中指定的菜单项“注入”到提供的`Menu`或`ContextMenu`对象中。同时,还需要更改`onOptionsItemSelected()`和`onContextItemSelected()`方法,以使用XML中指定的`android:id`值。
```java
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add:
add();
return(true);
case R.id.reset:
initAdapter();
return(true);
}
return(super.onOptionsItemSelected(item));
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info=
(AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
ArrayAdapter<String> adapter=(ArrayAdapter<String>)getListAdapter();
switch (item.getItemId()) {
case R.id.cap:
String word=words.get(info.position);
word=word.toUpperCase();
adapter.remove(words.get(info.position));
adapter.insert(word, info.position);
return(true);
case R.id.remove:
adapter.remove(words.get(info.position));
return(true);
}
return(super.onContextItemSelected(item));
}
```
#### 2. 弹窗消息的显示
在Android开发中,有时活动(或其他Android代码)需要向用户传达信息。并非与Android用户的每一次交互都能整齐地包含在由视图组成的活动中,可能会出现错误、后台任务耗时过长或异步事件(如收到消息)等情况。这时,就需要在传统用户界面之外与用户进行沟通。Android提供了多种系统来提醒用户,这里主要介绍两种弹出消息的方式:Toast和AlertDialog。
##### 2.1 Toast的使用
Toast是一种短暂的消息,它会自行显示并消失,无需用户交互,而且不会从当前活动中夺走焦点。因此,如果用户正在忙于编写代码,按键不会被消息“吃掉”。由于Toast是短暂的,我们无法知道用户是否注意到它,也不会得到用户的确认,消息也不会长时间停留来烦扰用户。所以,Toast主要用于提供咨询消息,例如指示长时间运行的后台任务已完成、电池电量已降至低水平等。
创建Toast很简单,`Toast`类提供了一个静态的`makeText()`方法,该方法接受一个字符串(或字符串资源ID)并返回一个Toast实例。`makeText()`方法还需要活动(或其他上下文)以及一个持续时间,持续时间以`LENGTH_SHORT`常量或`LENGTH_LONG`常量的形式表示,用于相对地指示消息应显示多长时间。
如果希望Toast由其他视图组成,而不是普通的文本,可以通过构造函数创建一个新的Toast实例(构造函数接受一个上下文),然后调用`setView()`方法提供要
0
0
复制全文
相关推荐








