封面画师:KNYT 封面ID:73718817
Android 应用的资源
定义资源文件时注意标签首字母小写!
定义资源文件时注意标签首字母小写!
定义资源文件时注意标签首字母小写!
字符串资源
字符串资源的使用
- 定义字符串资源文件
<string>
- 使用字符串资源 (在 XML 文件中、在 Java 文件中)
在 Java 文件中使用字符串资源我们也称其为:动态设置。
AS 在创建项目时,默认给我们创建了字符串资源文件。文件位置:res/values/string.xml
在XML文件中使用字符串资源:
首先在 string.xml 文件中新建资源:
注意:标签 <string></string> 中首字母是小写!
1
| <string name="motto">当你有使命,它会让你更专注</string>
|
activity_main.xml:
1 2 3 4 5 6 7 8 9 10 11
| <RelativeLayout
android:paddingStart="16dp"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:paddingBottom="16dp">
<TextView
android:id="@+id/mooto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/motto" />
</RelativeLayout>
|
在Java文件中使用字符串资源:
在使用前我们需要把上一步 XML 文件中设置的引用清空,即:删除 @string/motto
MainActivity.java:
1 2 3 4 5 6 7 8 9
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.mooto);
textView.setText(getResources().getString(R.string.motto));
}
}
|
颜色资源
颜色值:
Android 中,颜色值是由 透明度 加 红绿蓝三原色的值 来表示的。
格式: # + 透明度 + RGB
透明度由 0 到 F 的十六进制数表示,也可以使用 00 到 FF 的两位十六进制表示,其中 0 或 00 表示完全透明,F 或 FF 表示完全不透明。透明度在书写时也可以省略,默认表示完全不透明。
RGB 由 0 到 F 的十六进制数表示,也可以使用 00 到 FF 的两位十六进制表示。
在实际操作中我们一般使用拾色器获取颜色代码。
定义颜色资源文件
- 定义颜色资源文件
<color>
- 使用颜色资源(在 XML 文件中、在 Java 文件中)
AS 在创建项目时,默认给我们创建了字符串资源文件。文件位置:res/values/colors.xml
在XML文件中使用颜色资源:
首先在 colors.xml 文件中新建资源:
注意:标签 <color></color> 中首字母是小写!
1 2
| <color name="bg">#660000FF</color>
<color name="title">#FF6600</color>
|
activity_main.xml:
1 2 3 4 5 6 7 8
| <TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:background="@color/bg"
android:textColor="@color/title"
android:textSize="25dp"/>
|
在Java文件中使用颜色资源:
在使用前我们需要把上一步 XML 文件中设置的引用清空,即:删除 @color/bg 和 @color/title
MainActivity.java:
1 2 3 4 5 6 7 8 9 10
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.title);
textView.setTextColor(getColor(R.color.title));
textView.setBackgroundColor(getColor(R.color.bg));
}
}
|
在设置文字颜色时,需要我们修改 build.gradle 文件:将最小 sdk 版本更改至 23。
尺寸资源
常用尺寸单位:dp、sp
dp:设备独立像素。根据设备屏幕大小自适应。常用于边距、组件大小的设置。
sp:可伸缩像素。设置字体大小的单位。根据用户手机字体大小首选项进行缩放。
尺寸资源的使用
- 定义尺寸资源文件
<dimen>
- 使用尺寸资源 (在 XML 文件中、在 Java 文件中)
AS 在创建项目时,不会默认给我们创建了字符串资源文件。
需要我们手动创建,文件位置为:res/values/dimens.xml
在XML文件中使用尺寸资源:
首先在 dimens.xml 文件中新建资源:
注意:标签 <dimen></dimen> 中首字母是小写!
1 2 3 4
| <resources>
<dimen name="title">26sp</dimen>
<dimen name="padding">30dp</dimen>
</resources>
|
activity_main.xml:
1 2 3 4 5 6 7
| <TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="@dimen/title"
android:padding="@dimen/padding"/>
|
在Java文件中使用尺寸资源:
在使用前我们需要把上一步 XML 文件中设置的引用清空,即:删除 @dimen/title
在 Java 文件中,我们只进行设置字体大小,边距建议在 XML 文件中进行设置,简单方便。
MainActivity.java:
1 2 3 4 5 6 7 8 9
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.title);
textView.setTextSize(getResources().getDimension(R.dimen.title));
}
}
|
布局资源
布局资源位置:res/layout/**.xml
我们经常设置布局的 XML 文件就是布局资源文件,如:activity_main.xml
我们 在Java文件中使用布局资源,通常是用:
1
| setContentView(R.layout.activity_main);
|
在XML文件中使用布局资源文件:
假设我们已经在 layout 目录下创建了一个布局资源文件 image.xml,这时候我们想要在 activity_main.xml 中使用 image.xml 文件,那么可以使用:
1
| <include layout="@layout/image" ></include>
|
数组资源
数组定义:数组是具有 一组相同类型 的 一组数据 的 集合。
在 Android 中不推荐在 Java 程序中使用数组,而是建议使用数组资源文件。
使用数组
- 定义数组资源文件
- 使用尺寸资源 (在 XML 文件中、在 Java 文件中)
AS 在创建项目时,不会默认给我们创建了数组资源文件。
需要我们手动创建,文件位置为:res/values/array.xml。
<resources> 标签内子元素有:
| 子元素名 |
作用 |
<array> |
定义普通类型数组。颜色、字符串、尺寸资源 |
<integer-array> |
定义整型数组。可以是十进制、十六进制等 |
<string-array> |
定义字符串数组 |
在XML文件中使用尺寸资源:
使用场景:为下拉列表框或列表视图指定要显示的数据。
首先在 array.xml 文件中新建资源:
注意:标签 <string-array></string-array> 中首字母是小写!
1 2 3 4 5 6 7
| <resources>
<string-array name="listitem">
<item>活着就是为了改变世界,难道还有其他原因吗?</item>
<item>尝试很重要</item>
<item>求知若饥,虚心若愚</item>
</string-array>
</resources>
|
activity_main.xml:
1 2 3 4 5
| <ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@array/listitem"
android:id="@+id/listView"/>
|
在Java文件中使用尺寸资源:
在使用前我们需要把上一步 XML 文件中设置的引用清空,即:删除 @array/listitem
只有通过Adapter 才可以把列表中的数据映射到ListView 中。 所以,我们在此需要使用适配器,我们选择 ArrayAdapter。
MainActivity.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] arr = getResources().getStringArray(R.array.listitem);
ListView listView = findViewById(R.id.listView);
//使用适配器把列表中的数据映射到ListView
/**
* 通过ArrayAdapter 将数据和布局联系起来
* 参数1 当前上下文环境
* 参数2 当前引用的布局 一般系统默认
* 参数3 当前绑定的数据
* */
ArrayAdapter<String> adapter =
new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arr);
//将数据和布局 显示到列表
listView.setAdapter(adapter);
}
}
|
Drawable 资源
我们不仅可以使用图片作为资源,还可以使用多种 XML 作为资源。只要这个 XML 文件可以被系统编译成 Drawable 子类的对象,那么这个 XML 文件就可以作为 Drawable 资源。
Drawable 资源被保存在 res/drawable 目录下。AS 在创建项目时,会自动给我们创建 drawable 文件夹。
为了适应不同分辨率,我们一般会在 res 目录下手动创建以下目录:drawable-hdpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi。
Drawable资源一般分成两大类:图片资源和StateListDrawable资源。
图片资源
后缀名可以为:.png 、.jpg、.gif 、.9.png
.9.png 9-Patch 图片文件的后缀名,这种图片不可以通过 PS 或画图工具来制作。
我们可以通过 在AS中右击目标png图片,选择create 9-patch file… 即可,具体绘制步骤可参考界面提示。
9-Patch图片特性:
9-Patch 图片与普通图片不同,使用 9-Patch 图片作为屏幕或按钮的背景时,当屏幕的尺寸或按钮的大小改变时,图片可自动缩放,达到不失真的效果。
Android 中不允许图片资源的文件中出现大写字母,且不能以数字开头。
Android 中不允许图片资源的文件中出现大写字母,且不能以数字开头。
Android 中不允许图片资源的文件中出现大写字母,且不能以数字开头。
使用方法与普通图片一样。
StateListDrawable 资源
StateListDrawable 资源:定义在 XML 文件中的 Drawable 对象,根据状态呈现不同的图像。
<selector> 子标签 <item> 属性及其含义:
| 属性名 |
含义 |
| android:state_pressed |
是否处于按下状态 |
| android:state_focused |
是否处于聚焦状态 |
| android:state_selected |
是否处于选中状态 |
| android:state_checkable |
是否处于可勾选状态 |
| android:state_checked |
是否处于勾选状态 |
| android:state_enabled |
是否处于可用状态 |
| android:window_focused |
当前程序窗口是否有焦点 |
注意:StateList 中第一个匹配当前状态的 item 会被使用。因此,如果第一个 item 没有任何状态特性的话,那么它将每次都被使用,这也是为什么默认的值必须总是在最后。
实例:根据编辑框的焦点状态改变字体颜色
在 res/drawable 目录下,创建 StateListDrawable 资源文件 edittext_focused.xml:
1 2 3 4 5 6
| <selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--获得焦点时-->
<item android:state_focused="true" android:color ="#f60" />
<!--失去焦点时-->
<item android:state_focused="false" android:color="#0a0"/>
</selector>
|
activity_main.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/edittext_focused"
android:text="活着就是为了改变世界" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="当你有使命,它会让你更专注"
android:textColor="@drawable/edittext_focused"
android:layout_below="@+id/editText"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
|
mipmap 资源
AS 在创建项目时,会自动给我们创建 mipmap 文件夹。这个文件夹就是用来存放 mipmap 资源文件的。
mipmap 资源通常是 APP 的启动图标,我们把图标文件放在 mipmap 目录下,不仅可以提高系统渲染图片的速度,还可以图片的质量。
与 drawable 目录一样,mipmap 目录也拥有相同的目录结构。比如 mipmap 目录下也有 mipmap-hdpi、mipmap-mdpi,mipmap-xhdpi 等目录。
mipmap 资源的使用
在XML文件中使用:
我们在这使用系统默认的图标。
1 2 3 4 5
| <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
android:id="@+id/imageView"/>
|
在Java文件中使用:(一般不推荐这种方式)
在使用前我们需要把上一步 XML 文件中设置的引用清空,即:删除 @mipmap/ic_launcher
1 2 3 4 5 6
| protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = findViewById(R.id.imageView);
imageView.setImageResource(R.mipmap.ic_launcher);
}
|
mipmap 和 drawable 的区别
mipmap:存放应用程序图标
drawable:可以存放图像文件、9-Patch、Shape、StateListDrawable 等。
主题资源
作用:设置窗口整体样式,改变窗口外观。
在 AS 中我们可以切换系统自带的主题资源,在主题资源中还可以找到不显示 ActionBar 的主题资源。

除了使用系统自带的主题资源,我们还可以自定义主题资源。
AS 在创建项目时,默认给我们创建了主题资源文件。文件位置:res/values/styles.xml
自定义主题资源文件
准备:我们需要准备一张主题背景图片,命名为 image,放置于 res/drawable-v24 目录下。
编写主题资源文件,在 res/values/styles.xml 中进行编写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<!--设置所有或单个Activity的整体样式,不能用于单个的View组件-->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="bgTheme" parent="@style/AppTheme">
<!--设置窗口有标题栏-->
<item name="android:windowNoTitle">false</item>
<!--设置窗口背景-->
<item name="android:windowBackground">@drawable/background</item>
</style>
</resources>
|
编写好主题资源后,就可以使用主题资源。
使用主题资源有两个方式:
- 在 Androidmanifest.xml 文件中配置;
- 在 Java 文件中使用主题资源。
在Androidmanifest.xml文件中配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/bgTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
|
若想要给所有的 Activity 设置主题资源,那么就在 <application> 中的 android:theme 进行设置;若指向给某个 Activity 设置主题资源,那么就在 <activity> 中的 android:theme 进行设置。
在Java文件中使用主题资源:
MainActivity.java:
这里的类继承的是 Activity
1 2 3 4 5 6 7 8 9
| public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.bgTheme);
setContentView(R.layout.activity_main);
}
}
|
在 Java 文件中使用主题资源:在 Activity 的 onCreate() 方法中,设置使用的主题资源时,一定要在方法 setContentView() 之间设置,否则不起作用。
样式资源
我们可以在 res/values/styles.xml 中编写我们直接的样式资源。
既然样式资源和主题资源都是在 styles.xml 中进行编写,那他们有什么区别呢?
- 主题:设置整个 APP 或窗口样式
- 样式:设置组件的样式
样式资源的使用
在 styles.xml 文件中编写我们自定义的样式:
1 2 3 4 5 6 7 8 9
| <style name="title">
<item name="android:textSize">30sp</item>
<item name="android:textColor">#06F</item>
</style>
<!--style可以被继承-->
<!--当子style与父style有相同的设置时,使用子style中的属性-->
<style name="context" parent="title">
<item name="android:textSize">18sp</item>
</style>
|
其他属性我们可以自行摸索理解。
样式资源文件我们一般在XML文件中使用。
activity_main.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <RelativeLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="乔布斯"
style="@style/title"
android:id="@+id/textView"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="活着就是为了改变世界,难道还有其他原因吗?"
android:layout_below="@+id/textView"
style="@style/context"/>
</RelativeLayout>
|
菜单资源
AS 在创建项目时,不会默认给我们创建了菜单资源目录及文件。
需要我们手动创建,文件位置为:res/menu/**.xml
菜单资源的使用
在 res/menu 目录下创建 menu.xml 编写我们的菜单资源文件:
1 2 3 4 5 6 7
| <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="message" android:title="消息"></item>
<item android:id="homepage" android:title="首页"></item>
<item android:id="help" android:title="帮助"></item>
<item android:id="feedback" android:title="我要反馈"></item>
</menu>
|
创建选项菜单
选项菜单:点击手机上的物理按键(菜单键)或手机 APP 右上角的三个小圆点弹出的菜单。
创建步骤:
- 添加选项菜单;
- 指定菜单项被选中时应做出的处理。
创建右上角圆点菜单,并对选中项做出处理
在res目录下创建:menu/setting_menu.xml:
1 2 3 4
| <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/settings" android:title="设 置"></item>
<item android:id="@+id/regard" android:title="关 于"></item>
</menu>
|
编写处理界面:
activity_main.xml:
1 2 3 4
| <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置界面"/>
|
acitivity_regard.xml:
1 2 3 4
| <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关于界面"/>
|
activity_main.xml 使用默认即可。
在MainActivity中添加菜单选项,并对所选项做出处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//3. 重写onCreateOptionsMenu,添加选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.setting_menu,menu);
return super.onCreateOptionsMenu(menu);
}
//4. 对各个菜单项进行处理
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.settings:
Intent intent = new Intent(MainActivity.this, Settings.class);
startActivity(intent);
break;
case R.id.regard:
Intent intent1 = new Intent(MainActivity.this, Regard.class);
startActivity(intent1);
break;
}
return super.onOptionsItemSelected(item);
}
}
|
创建上下文菜单
上下文菜单:就是我们在界面上长按某一组件时弹出的菜单。
创建步骤:
- 为主键注册上下文菜单;
- 添加上下文菜单;
- 指定菜单项被选择时所应作出的处理。
选中文字并长按,弹出上下文菜单,并对说选项做出处理
在res目录下创建:menu/menu.xml, 自定义上下文菜单内容
1 2 3 4 5 6
| <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/mune_copy" android:title="复制"></item>
<item android:id="@+id/mune_collect" android:title="收藏"></item>
<item android:id="@+id/mune_translate" android:title="翻译"></item>
<item android:id="@+id/mune_report" android:title="举报"></item>
</menu>
|
设置 activity_main.xml 布局资源文件内容:
1 2 3 4 5
| <TextView
android:id="@+id/introduce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="安卓是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。" />
|
在MainActivity中添加菜单选项,并对所选项做出处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class MainActivity extends AppCompatActivity {
TextView introduce;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1. 为文本框注册上下文菜单
introduce = findViewById(R.id.introduce);
registerForContextMenu(introduce);
}
//2. 重写onCreateContextMenu方法,添加上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater menuInflater = new MenuInflater(this);
menuInflater.inflate(R.menu.menu,menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
//3. 重写方法,指定各个菜单项被选中时应作出的处理
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.mune_copy:
Toast.makeText(MainActivity.this, "已复制", Toast.LENGTH_SHORT).show();
break;
case R.id.mune_collect:
Toast.makeText(MainActivity.this, "已收藏", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}
|
Action Bar 的使用
初识 Action Bar
Action Bar 可以含有:APP 图标、Activity 标题、选项菜单、溢出菜单、向上按钮、Tab 导航等。
可供参考链接: 参考链接1
显示和隐藏 Action Bar
从 Android 3.0(API 11)开始 Activity 就默认包含了 Action Bar 组件。
显示Action Bar:
那么只需要在 build.gradle 文件中将 android:minSdkVersion 设置成 11 或以上版本就可以了。
隐藏Action Bar:
若想要给所有的 Activity 都不显示 Action Bar,那么就将 <application> 中的 android:theme 设置成后缀为 .NoActionBar 的主题;若指向给某个 Activity 不显示 Action Bar,那么就将 <activity> 中的 android:theme 设置成后缀为 .NoActionBar 的主题。
如: android:theme="@style/Theme.AppCompat.Light.NoActionBar"
通过按钮来显示或隐藏 Action Bar
在 activity_main.xml 中编写两个按钮组件,用于控制 Action Bar 的显示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <LinearLayout
android:orientation="horizontal"
android:gravity="center_horizontal">
<Button
android:id="@+id/button_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示Action Bar"
android:textAllCaps="false"/>
<Button
android:id="@+id/button_hide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="隐藏Action Bar"
android:textAllCaps="false"/>
</LinearLayout>
|
MainActivity.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ActionBar actionBar = getSupportActionBar();
Button button_show = findViewById(R.id.button_show);
Button button_hide = findViewById(R.id.button_hide);
button_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
actionBar.show();
}
});
button_hide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
actionBar.hide();
}
});
}
|
添加 Action Item
在 Action Bar 上可以看到很多 小图标,这些小图标就叫做:Action Item。由于 Action Bar 上的空间是有限的,有些放不下的小图标可以放到 溢出菜单。
Action Bar空间划分示例:

添加Action Item的步骤:
- 定义菜单资源文件;
- 在 onCreateOptionsMenu()方法中加载菜单资源文件。
在 Action Bar 中添加 Action Item
准备:需要准备两个图标文件,分别表示搜索和消息,并分别命名为 search 和 bell,将它们放置在 drawable 目录下。
在res目录下创建:menu/menu.xml, 自定义 Action Item:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search"
android:icon="@drawable/search"
android:title="search"
app:showAsAction="always"/>
<item android:id="@+id/bell"
android:icon="@drawable/bell"
android:title="消息"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/settings"
android:title="设置"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/about"
android:title="关于"
app:showAsAction="never"/>
</menu>
|
在 MainActivity.java 中解析菜单文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//解析菜单资源文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu,menu);
return super.onCreateOptionsMenu(menu);
}
}
|
showAsAction 属性详解:
属性详解:
- always:无论是否溢出,总会显示在 Action Bar 上。如果同时设置了 icon 和 title,默认只会显示 icon。
- ifRoom:可以显示在 Item 中。但是如果超出了菜单项的空间会隐藏在溢出菜单中,只显示 title。菜单项的空间根据屏幕的宽窄而定。
- never:永远不会显示。只会在溢出菜单中显示,而且只显示 title,所以在定义 item 的时候,需要设置 title。
- collapseActionView:声明了 collapseActionView 的 Action View 会被折叠到一个按钮中,当用户点击这个按钮时,这个 Action View 才会展开。否则,这个 Action View 在默认的情况下是可见的,并且即便在不使用的时候,也要占据操作栏的有效空间。一般要配合 ifRoom 一起使用才会有效果。
- withText:使 Action Item 显示 title。Action Item 会尽可能的显示这个标题,但它会受到菜单项空间的限制而使文本标题有可能显示不全。
官方建议我们在设置 <item> 时设置 title 属性,我们在长按 icon 的情况下 title 就会出现,另外官方还建议 showAsAction 最好设置为 ifRoom,因为如果设置为 always 可能会在比较窄的屏幕上带来布局的问题。
showAsAction属性值withText解析:
在 showAsAction属性详解 中我们已经知道可以通过设置 withText 作为属性值来显示 title。因此我们是否可以通过设置app:showAsAction="always|withText"来同时显示 title 和 icon
我们发现这样也不一定生效,因为 withText 对 actionBar 的 title 来说只是一个 hint,在条件允许的情况下 actionBar 会显示 title,但是当设置了 icon 并由于空间限制也不会显示 title。
而且 系统默认在竖屏时是只显示icon,不论是否设置了 withText 属性在竖屏时都只显示 icon 而不显示 title。withText 属性要在横屏时才体现的出来,将设备横屏显示就既显示图标又显示文字了。
添加 Action View
在一些 APP 界面的 Action Bar 上,经常可以看到有用来进行搜索操作的输入框或者可以进行搜索的组件,这些就是 Action View。但也并不是说只有搜索框或搜索组件才是 Action View,Action View 是用于替换 Action Button 并显示在 Action Bar 上面的一种可视组件。
添加 Action View
方法:
- 通过
app:actionViewClass 属性,依赖实现类。
- 通过
app:actionLayout 属性,依赖布局文件。
准备:需要准备两个图标文件,分别表示通讯录和添加,将其命名为 message 和 add,置于 drawable 目录下。
Action View 布局文件:
img_add.xml:
1 2 3 4 5 6 7 8 9 10
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:src="@drawable/add"/>
</LinearLayout>
|
img_message.xml:
1 2 3 4 5 6 7 8 9 10
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:src="@drawable/message"/>
</LinearLayout>
|
在res目录下创建:menu/menu.xml, 自定义 Action View:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/search"
android:title="搜索"
app:showAsAction="always"
app:actionViewClass="android.widget.SearchView" />
<item
android:id="@+id/img1"
android:title="通讯录"
app:actionLayout="@layout/img_message"
app:showAsAction="always"/>
<item
android:id="@+id/img2"
android:title="添加"
app:actionLayout="@layout/img_add"
app:showAsAction="always"/>
</menu>
|
在 MainActivity.java 中解析菜单文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//隐藏Action Bar上的显示标题
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
//解析菜单资源文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu,menu);
return super.onCreateOptionsMenu(menu);
}
}
|
Action Bar 与 Tab
在最新版的 Android 中,已经不推荐使用这种方法来实现顶部的 Tab 切换,推荐使用 TabLayout。
内容太多,在此给出 4 片文章作为参考,也可根据自己需要自行搜索:
TabLayout-标签布局-
Android TabLayout
Tablayout使用全解,一篇就够了
TabLayout使用详解
前三篇为属性讲解和基本使用,最后一篇为小实战。
实现层级式导航
在 APP 的一些界面中,我们可以看到左上角有一个返回箭头,当我们点击这个箭头时,我们就会回到上一界面,这个箭头启用了层级式导航才实现了这样的功能。
实现方法:
- 设置导航图标显示:使用
setDisplayHomeAsUpEnabled()
- 配置父 Activity:在 AndroidManifest.xml 中配置
实现层级式导航
准备:需要一张图片。命名为 image,放置于 drawable 目录下。
自定义图片展示界面:activity_pic.xml
1 2 3 4 5 6 7 8 9
| <RelativeLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/image"
tools:context=".PicActivity">
</RelativeLayout>
|
定义程序主入口界面:activity_main.xml:
1 2 3 4 5 6 7 8 9
| <RelativeLayout >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="查看图片"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"/>
</RelativeLayout>
|
实现在主界面点击按钮跳转至图片展示界面:MainActivity.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, PicActivity.class);
startActivity(intent);
}
});
}
}
|
判断父 Activity 是否为空,设置跳转箭头,实现层级式导航:
PicActivity.java:
1 2 3 4 5 6 7 8 9 10 11 12
| public class PicActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pic);
//判断父Activity是否为空,如果不为空,设置导航图标显示
if (NavUtils.getParentActivityIntent(PicActivity.this) != null){
//显示向左的导航图标
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
}
|
最后在 AndroidManifest.xml 中声明图片展示界面的父 Activity:
1 2 3 4 5 6 7
| <activity
android:name=".PicActivity"
android:label="图片">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
|
消息、通知与广播
通过 Toast 显示消息提示框
消息提示框特点:
- 没有控制按钮
- 不会获得焦点
- 过一会自动消失
显示消息提示框的步骤:
- 创建 Toast 对象
- 使用构造方法:
new Toast(context)
makeText() 方法:指定显示的内容、持续的时间
- 设置消息提示的方式
- 调用
show() 方法
一定不能忘记调用 show() 方法,否则消息提示框不会显示并且程序也不会产生任何异常信息。
使用示例:
1
| Toast.makeText(MainActivity.this, "******", Toast.LENGTH_SHORT).show();
|
makeText 第一个参数为上下文对象,第二个参数为消息内容,第三个参数为持续时间。
持续时间: LENGTH_SHORT(2 s) LENGTH_LONG(3.5 s)
使用 AlertDialog 实现对话框
对话框组成部分:
其中,图标区和标题区 不是必须的。
应用 AlertDialog 类实现 4 种不同类型的对话框
准备:我们需要 3 张图标资源,分别表示 iPhone、接收短信和骰子,并命名为 iphone、like 和 dice,将他们放置于 drawable 目录下。
编写布局资源文件 activity_main.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| <LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="16dp"
android:paddingEnd="16dp"
android:paddingStart="16dp"
android:paddingBottom="16dp"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#38cfd1"
android:textColor="#FFFFFF"
android:textSize="16sp"
android:layout_marginBottom="20dp"
android:text="显示带取消、确定按钮的对话框"/>
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#3961b7"
android:textColor="#FFFFFF"
android:textSize="16sp"
android:layout_marginBottom="20dp"
android:text="显示带列表的对话框"/>
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#43b243"
android:textColor="#FFFFFF"
android:textSize="16sp"
android:layout_marginBottom="20dp"
android:text="显示带单选列表项的对话框"/>
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f9671c"
android:textColor="#FFFFFF"
android:textSize="16sp"
android:text="显示带多选列表项的对话框"/>
</LinearLayout>
|
编写 MainActivity.java,使用 AlertDialog 实现对话框:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*************显示带取消、确定按钮的对话框***************/
Button button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建AlertDialog对象
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setIcon(R.drawable.iphone);
alertDialog.setTitle("乔布斯:");
alertDialog.setMessage("活着就是为了改变世界,难道还有其他原因吗?");
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
"否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,
"您单击了否按钮", Toast.LENGTH_SHORT).show();
}
});
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE,
"是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,
"您单击了是按钮", Toast.LENGTH_SHORT).show();
}
});
/**
* BUTTON_POSITIVE 表示确认按钮
* BUTTON_NEUTRAL 表示中立按钮
* BUTTON_NEGATIVE 表示取消按钮
*/
alertDialog.show();
}
});
/*****************显示带列表的对话框********************/
Button button2 = findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//带4个列表项的列表对话框
final String[] items = new String[]{"当你有使命,它会让你更专注",
"要么出众,要么出局",
"活着就是为了改变世界", "求知若饥,虚心若愚"};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.like);
builder.setTitle("请选择你喜欢的名言");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,
"你选择了【" + items[which] + "】",
Toast.LENGTH_SHORT).show();
}
});//添加列表项
builder.create().show();//创建并显示对话框
}
});
/***************显示带单选列表项的对话框****************/
Button button3 = findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建带单选列表项的对话框
final String[] items = new String[]{"扎克伯格", "乔布斯",
"拉里·埃里森", "安迪·鲁宾", "马云"};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.dice);
builder.setTitle("你更喜欢谁?");
builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,
"你选择了【" + items[which] + "】",
Toast.LENGTH_SHORT).show();
}
});//添加列表项
builder.setPositiveButton("确定", null);
builder.create().show();//创建并显示对话框
}
});
/**************显示带多选列表项的对话框*****************/
Button button4 = findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//带多选列表项的对话框
//记录各列表项的选中状态
final boolean[] checkedItems = new boolean[]{false, true, false, true, false};
final String[] items = new String[]{"LOL", "DOTA", "WOWS",
"Warcraft", "StarCraft"};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.dice);
builder.setTitle("请选择你喜爱的游戏");
builder.setMultiChoiceItems(items, checkedItems,
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
checkedItems[which] = isChecked;//改变被操作列表项的状态
}
});//添加列表项
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String result = ""; //记录结果字符串
for (int i = 0; i < checkedItems.length; i++) {
if (checkedItems[i]){
result+=items[i]+"、";//把列表项的内容添加到result中
}
}
if (!"".equals(result)){
Toast.makeText(MainActivity.this,
"你选择了【"+result+"】",
Toast.LENGTH_SHORT).show();
}
}
});//添加确认按钮
builder.create().show();//创建并显示对话框
}
});
}
}
|
总结:

使用 Notification 显示通知
这里的通知是指在顶部状态栏上的通知。
使用Notification显示通知的步骤:
- 获取系统的 NotificationManager 服务。使用
getSystemService() 方法。
- 创建 Notification 对象。使用
new Notification.Builder(this)
- 为 Notification 对象设置属性。 使用
setContentTitle()、setContentText()…
- 发送 Notification 通知。使用 NotificationManager 类的
notify() 方法。
参考链接:Android Notification(通知)(含兼容问题)
实现点击状态栏通知跳转界面
案例概述:运行程序后,在程序主入口界面状态栏出现通知,点击通知后,跳转至图片显示界面。
准备:需要一张表示图片的图标文件(pic.png)和一张图片(image1.png),将它们放置于 res/drawable 目录下。
- 创建 Activity——DetailActivity.java 及其布局资源文件。
activity_main.xml 使用默认布局资源。
编写点击通知后跳转的界面 activity_detail.xml:
1 2 3 4 5 6 7 8
| <RelativeLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/image1"
tools:context=".DetailActivity">
</RelativeLayout>
|
- 在 MainActivity.java 中设置状态栏通知。
DetailActivity.java 使用默认 Activity。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| public class MainActivity extends AppCompatActivity {
final int NOTIFY_ID = 0x123;//通知id
public static final String NOTIFICATION_CHANNEL_ID = "10001";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建并发送通知
//获取通知管理器
NotificationManager notificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//创建通知对象
Notification.Builder builder = new Notification.Builder(MainActivity.this);
// 详情见代码末尾的问题思考
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel notificationChannel =
new NotificationChannel(NOTIFICATION_CHANNEL_ID,
"NOTIFICATION_CHANNEL_NAME",
importance);
builder.setChannelId(NOTIFICATION_CHANNEL_ID);
notificationManager.createNotificationChannel(notificationChannel);
}
//设置通知打开后自动消失
builder.setAutoCancel(true)
.setSmallIcon(R.drawable.pic)//设置通知图标
.setContentTitle("请接收你的图片") //为通知设置标题
.setContentText("点击查看详情")//设置通知内容
.setWhen(System.currentTimeMillis())//设置发送时间:即时发送
//设置通知的声音、震动
.setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE);
//创建一个启动详细页面的Intent
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,0);
builder.setContentIntent(pendingIntent);
notificationManager.notify(NOTIFY_ID,builder.build());
}
}
|
问题思考
编写好 MainActivity 运行后,状态栏不会显示通知,并弹出消息提示框,显示:Failed to post notification on channel “null”
参考链接:Failed to post notification on channel “null”
原因:Since Android Oreo, you need a Channel to send your notifications.
解决方法:
1 2 3 4 5 6 7 8 9
| if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel notificationChannel =
new NotificationChannel(NOTIFICATION_CHANNEL_ID,
"NOTIFICATION_CHANNEL_NAME",
importance);
builder.setChannelId(NOTIFICATION_CHANNEL_ID);
notificationManager.createNotificationChannel(notificationChannel);
}
|
其中,notificationManager是实例的NotificationManager对象,builder是实例的Notification.Builder对象。
使用 BroadcastReceiver
BroadcastReceiver:广播接收器。
在安卓中,广播没有自己的表现形式,但我们可以通过通知、对话框、消息提示框来展示出来。
使用 BroadcastReceiver 接收广播
案例介绍:点击按钮,发送广播,然后接收广播并弹出消息提示框显示广播。
程序主入口:activity_main.xml:
1 2 3 4 5 6 7 8
| <RelativeLayout >
<Button
android:id="@+id/broadcast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送一条广播"
android:layout_centerHorizontal="true" />
</RelativeLayout>
|
编写广播接收器,新建 MyReceiver.java 类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| //创建广播接收器
public class MyReceiver extends BroadcastReceiver {
private static final String ACTION_1 = "扎克伯格";
private static final String ACTION_2 = "马云";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_1)){//回复第一条广播
Toast.makeText(context,
"MyReceiver收到:扎克伯格的广播..."+intent.getStringExtra("msg"),
Toast.LENGTH_SHORT).show();
}else if (intent.getAction().equals(ACTION_2)){//回复第二条广播
Toast.makeText(context,
"MyReceiver收到:马云的广播..."+intent.getStringExtra("msg"),
Toast.LENGTH_SHORT).show();
}
}
}
|
在 MainActivity.java 中发送广播:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class MainActivity extends AppCompatActivity {
private MyReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.broadcast);
IntentFilter filter = new IntentFilter();
filter.addAction("扎克伯格");
filter.addAction("马云");
receiver = new MyReceiver();
registerReceiver(receiver,filter);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送一条广播
Intent intent = new Intent();
intent.setAction("扎克伯格");//为Intent添加动作
intent.putExtra("msg","比尔盖茨");
sendBroadcast(intent);//发送广播
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
|
我们在这个案例中使用的是动态注册广播,因为我们使用的是 Android 10,在 Android 8 及以上的版本中静态注册广播的方式无效,因此选用动态注册广播。
至于静态注册在此不再说明,只需要在 AndroidManifest.xml 文件中配置即可,可自行搜索了解。
使用 AlarmManager 设置闹钟
通过案例来介绍:
应用 AlarmManager 类实现一个定时启动的闹钟
案例介绍:先设置一个闹钟,当到达设置的时间后,会弹出对话框显示。
准备:需要一张表示闹钟的图标资源文件,命名为 alarm,放置于 res/drawable 目录下。
编写布局资源文件 activity_main.xml,放置时间选择器和按钮组件:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <RelativeLayout>
<TimePicker
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/set"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="设置闹钟"/>
</RelativeLayout>
|
编写 AlarmActivity.java,创建闹钟提示内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| //创建闹钟提醒内容
public class AlarmActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AlertDialog alert = new AlertDialog.Builder(this).create();
setContentView(R.layout.activity_alarm);
alert.setIcon(R.drawable.alarm);
alert.setTitle("每日一句:");
alert.setMessage("要么出众,要么出局");
alert.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//不做操作
}
});
alert.show();
}
}
|
编写 MainActivity.java 设置闹钟:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TimePicker timePicker = findViewById(R.id.time);
timePicker.setIs24HourView(true);
Button button = findViewById(R.id.set);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AlarmActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,
0,intent,0);
//获取AlarmManager对象
AlarmManager alarmManager =
(AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();//获取日历对象
calendar.set(Calendar.HOUR_OF_DAY,timePicker.getCurrentHour());//设置闹钟的小时数
calendar.set(Calendar.MINUTE,timePicker.getCurrentMinute());//设置闹钟的分钟数
calendar.set(Calendar.SECOND,0); //设置闹钟的秒数
/**
* ELAPSED_REALTIME:设置在指定的延时后提醒,不会唤醒系统
* ELAPSED_REALTIME_WAKEUP:设置在指定的延时后提醒,会唤醒系统
* RTC:使用真实的时间提醒,到达指定的时间提醒,不会唤醒系统
* RTC_WAKEUP:使用真实的时间提醒,到达指定的时间提醒,会唤醒系统
*/
//设置闹钟类型
alarmManager.set(AlarmManager.RTC_WAKEUP,
calendar.getTimeInMillis(),pendingIntent);
Toast.makeText(MainActivity.this, "闹钟设置成功", Toast.LENGTH_SHORT).show();
}
});
}
}
|
闹钟类型
ELAPSED_REALTIME:设置在指定的延时后提醒,不会唤醒系统
ELAPSED_REALTIME_WAKEUP:设置在指定的延时后提醒,会唤醒系统
RTC:使用真实的时间提醒,到达指定的时间提醒,不会唤醒系统
RTC_WAKEUP:使用真实的时间提醒,到达指定的时间提醒,会唤醒系统
使用 AlarmManager 类的实例对象中的 set() 方法设置闹钟。
Android 资源、活动条与信息通知完