第十讲用户资源&通知、对话框和警告
文章目录
0. 学习指导
本讲除了StateListDrawable、9- -Patch和一一个用户资源的实例外,主要介绍了通知、对话框与警告的使用方法。
在图形界面中,对话框和通知是人机交互的两种重要形式,在开发Android应用时,经常需要弹出消息提示框、对话框和显示通知等内容。另外,手机中设置闹钟也是比较学用的功能。本讲的对于这方面的的主要内容有: .
1.通过Toast显示消息提示框
2.使用AlertDialog实现对话框
3.使用Notification在状态栏上显示通知
4.使用AlarmManager设置警告
1. StateListDrawable资源
StateListDrawable资源是定义在XML文件中的Drawable对象,能根据状态来呈现不同的图像。
StateL istDrawable资源文件同图片资源一样,也是放在res/drawable- xxx目录中。StateListDrawable资源 文件的根元素为<selector> </selector>
,在该元素中可以包括多个<item></item>
元素。
每个Item元素可以设置以下两个属性。
android:color或android:drawable:用于指定颜色或者Drawable资源;
android:state_ XXX: 用于指定一个特定的状态。
selector标签
必备。这必须是根元素。包含一个或多个<item>
元素。
属性:
xmlns:android
字符串。必备。定义 XML 命名空间,其必须是 “http://schemas.android.com/apk/res/android”。
android:constantSize
布尔值。如果可绘制对象报告的内部大小在状态变更时保持不变,则值为“true”(大小是所有状态的最大值);如果大小根据当前状态而变化,则值为“false”。默认值为 false。
StateListDrawable的固有大小是否不随着其状态的改变而改变,因为状态的改变会导致StateListDrawable切换到具体的Drawable,而不同的Drawable具有不同的固有大小。True表示StateListDrawable的固有大小保持不变,这时他的固有大小是内部所有Drawable的固有大小的最大值,false则会改变。
需要注意:如果是把这个drawable当做背景的话,那么这个drawable固有大小不管多大,都会拉伸到View的大小
如果给ImageView当做src使用,那么,false之后就会drawable的固有大小就变了,并且其并不会拉伸值ImageView的大小,可以得到一大一下的效果。
android:dither
布尔值。值为“true”时,将在位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕)启用位图的抖动;值为“false”时则停用抖动。默认值为 true。
android:variablePadding
布尔值。如果可绘制对象的内边距应根据选择的当前状态而变化,则值为“true”;如果内边距应保持不变(基于所有状态的最大内边距),则值为“false”。启用此功能要求您在状态变更时处理执行布局,这通常不受支持。默认值为 false。不建议开启此项
item标签
定义要在某些状态期间使用的可绘制对象,如其属性所述。必须是<selector>
元素的子项。
属性:
android:drawable
可绘制对象资源。必备。引用可绘制对象资源。
android:state_pressed
布尔值。如果在按下对象(例如触摸/点按某按钮)时应使用此项目,则值为“true”;如果在默认的未按下状态时应使用此项目,则值为“false”。比如ImageView,只有你设置android:clickable = true ,就可以满足
android:state_focused
布尔值。如果在对象具有输入焦点(例如当用户选择文本输入时)时应使用此项目,则值为“true”;如果在默认的非焦点状态时应使用此项目,则值为“false”。
android:state_hovered
布尔值。如果当光标悬停在对象上时应使用此项目,则值为“true”;如果在默认的非悬停状态时应使用此项目,则值为“false”。通常,这个可绘制对象可能与用于“聚焦”状态的可绘制对象相同。
此项为 API 级别 14 新引入的配置。
android:state_selected
布尔值。如果在使用定向控件浏览(例如使用方向键浏览列表)的情况下对象为当前用户选择时应使用此项目,则值为“true”;如果在未选择对象时应使用此项目,则值为“false”。
当焦点 (android:state_focused) 不充分(例如,列表视图有焦点但使用方向键选择其中的项目)时,使用所选状态。
android:state_checkable
布尔值。如果当对象可选中时应使用此项目,则值为“true”;如果当对象不可选中时应使用此项目,则值为“false”。(仅当对象可在可选中与不可选中小部件之间转换时才有用。)指示对象可以显示复选标记的状态标识符。比如checkbox
android:state_checked
布尔值。如果在对象已选中时应使用此项目,则值为“true”;如果在对象未选中时应使用此项目,则值为“false”。一般也是checkbox这类再选中和非选中之间进行切换的View.
android:state_enabled
布尔值。如果在对象启用(能够接收触摸/点击事件)时应使用此项目,则值为“true”;如果在对象停用时应使用此项目,则值为“false”。
android:state_activated
布尔值。如果在对象激活作为持续选择(例如,在持续导航视图中“突出显示”之前选中的列表项)时应使用此项目,则值为“true”;如果在对象未激活时应使用此项目,则值为“false”。
此项为 API 级别 11 新引入的配置。
android:state_window_focused
布尔值。如果当应用窗口有焦点(应用在前台)时应使用此项目,则值为“true”;如果当应用窗口没有焦点(例如,通知栏下拉或对话框出现)时应使用此项目,则值为“false”。
参考链接:https://www.jianshu.com/p/c3960d7a8c57
示例
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#f60" android:state_focused="true"></item>
<item android:color="#0a0" android:state_focused="false"></item>
</selector>
android:textColor="@drawable/edittext"
2. 样式styte和主题theme资源
stytes
<resources>
<!-- Base application theme. -->
<style name="AppTheme">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
theme
给activity设置 manifest.xml中设置
settheme(R.id.bg) java 中设置
<resources>
<style name="bg" >
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
</style>
</resources>
3. 程序国际化 I18N
values
values-en-US
values-zh-CN
values-zh-TW
4. 通过Toast显示消息提示框
- 构造方法:
Toast toast=new Toast(this);
//显示文本+图片的Toast
public static void showImageToas(Context context,String message){
View toastview= LayoutInflater.from(context).inflate(R.layout.toast_image_layout,null);
TextView text = (TextView) toastview.findViewById(R.id.tv_message);
text.setText(message); //要提示的文本
Toast toast=new Toast(context); //上下文
toast.setGravity(Gravity.CENTER,0,0); //位置居中
toast.setDuration(Toast.LENGTH_SHORT); //设置短暂提示
toast.setView(toastview); //把定义好的View布局设置到Toast里面
toast.show();
}
//显示文本的Toast
public static void showTextToas(Context context,String message){
View toastview= LayoutInflater.from(context).inflate(R.layout.toast_text_layout,null);
TextView text = (TextView) toastview.findViewById(R.id.tv_message);
text.setText(message);
Toast toast=new Toast(context);
toast.setGravity(Gravity.CENTER,0,0);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(toastview);
toast.show();
}
- makeText方法
Toast toast=Toast.makeText(this,“要显示的内容,TOast.LENGTH SHORT);
Toast.makeText(Context context, int resId, int duration)
Toast.makeText(Context context, CharSequence text, int duration)
Context为上下文,通常为当前activity;resId是string字符串的id,CharSequence为你要显示的字符串,duration为显示的时间,可以选择Toast.LENGTH_SHORT或Toast.LENGTH_LONG,也可自定义时间。
5. 使用AlertDialog实现对话框
- 带确定、中立和取消等N个按钮的提示对话框
- 带列表的列表对话框
- 带多个单选列表项和N个按钮的列表对话框
- 带多个多选列表项和N个按钮的列表对话框。
属性
方法. | 描述 |
---|---|
setTitle(ChaSequmnce title) | 用千为对话框设置标题 |
setIcon(Drawable icon) | 用千为对话框设置图标 |
aotlcon(R.id.) | 用于为对话框设置图标 |
otMesaugr(ChutSequencemetgr) | 用千为提示对话框设置要显示的内容 |
oetNegativeButon() | 用千为对话框添加取消按招 |
setPoitiveButtor() | 用千为对话框添加确定披招 |
aetNeutroIButon() | 用于为对话框添加中立按招 |
setItemn() | 用于为对话框添加列表项 |
aetSingeChoiceltema() | 用于为对话框添加单选列表项 |
setMultiChoiceItem() | 用于为对话框添加多选列表项 |
- 普通对话框
private void showNormalDialog(){
//创建dialog构造器
AlertDialog.Builder normalDialog = new AlertDialog.Builder(this);
//设置title
normalDialog.setTitle(getString(R.string.dialog_normal_text));
//设置icon
normalDialog.setIcon(R.mipmap.ic_launcher_round);
//设置内容
normalDialog.setMessage(getString(R.string.dialog_normal_content));
//设置按钮
normalDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,getString(R.string.dialog_btn_confirm_hint_text)
,Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
//创建并显示
normalDialog.create().show();
}
- 普通对话框(多按钮)
在系统对话框中最多出现三个按钮,即PositiveButton(确定)、NegativeButton(取消)、NeutralButton(忽略)。
private void showNormalMoreButtonDialog(){
AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this);
normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text));
normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round);
normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content));
//设置按钮
normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this
,getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,
getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,
getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
normalMoreButtonDialog.create().show();
}
或
private void showNormalMoreButtonDialog(){
DialogInterface.OnClickListener setListener = null;
AlertDialog.Builder normalMoreButtonDialog = new AlertDialog.Builder(this);
normalMoreButtonDialog.setTitle(getString(R.string.dialog_normal_more_button_text));
normalMoreButtonDialog.setIcon(R.mipmap.ic_launcher_round);
normalMoreButtonDialog.setMessage(getString(R.string.dialog_normal_more_button_content));
setListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
Toast.makeText(DialogActivity.this,
getString(R.string.dialog_btn_confirm_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
break;
case DialogInterface.BUTTON_NEUTRAL:
Toast.makeText(DialogActivity.this
,getString(R.string.dialog_btn_neutral_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
break;
case DialogInterface.BUTTON_NEGATIVE:
Toast.makeText(DialogActivity.this
,getString(R.string.dialog_btn_cancel_hint_text),Toast.LENGTH_SHORT).show();
dialog.dismiss();
break;
}
}
};
normalMoreButtonDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text),setListener);
normalMoreButtonDialog.setNegativeButton(getString(R.string.dialog_btn_cancel_text),setListener);
normalMoreButtonDialog.setNeutralButton(getString(R.string.dialog_btn_neutral_text),setListener);
normalMoreButtonDialog.create().show();
}
- 普通列表对话框
private void showListDialog(){
final String listItems[] = new String[]{"listItems1","listItems2","listItems3",
"listItems4","listItems5","listItems6"};
AlertDialog.Builder listDialog = new AlertDialog.Builder(this);
listDialog.setTitle(getString(R.string.dialog_list_text));
listDialog.setIcon(R.mipmap.ic_launcher_round);
/*
设置item 不能用setMessage()
用setItems
items : listItems[] -> 列表项数组
listener -> 回调接口
*/
listDialog.setItems(listItems,new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,listItems[which],Toast.LENGTH_SHORT).show();
}
});
//设置按钮
listDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
listDialog.create().show();
}
- 单选对话框
private void showRadioDialog(){
final String radioItems[] = new String[]{"radioItem1","radioItem1","radioItem1","radioItem1"};
AlertDialog.Builder radioDialog = new AlertDialog.Builder(this);
radioDialog.setTitle(getString(R.string.dialog_radio_text));
radioDialog.setIcon(R.mipmap.ic_launcher_round);
/*
设置item 不能用setMessage()
用setSingleChoiceItems
items : radioItems[] -> 单选选项数组
checkItem : 0 -> 默认选中的item
listener -> 回调接口
*/
radioDialog.setSingleChoiceItems(radioItems, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,radioItems[which],Toast.LENGTH_SHORT).show();
}
});
//设置按钮
radioDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
radioDialog.create().show();
}
- 多选对话框
final String checkBoxItems[] = new String[]{"checkBoxItems1","checkBoxItems2",
"checkBoxItems3","checkBoxItems4"};
final boolean isCheck[] = new boolean[]{false,true,true,false};
AlertDialog.Builder checkBoxDialog = new AlertDialog.Builder(this);
checkBoxDialog.setTitle(getString(R.string.dialog_check_box_text));
checkBoxDialog.setIcon(R.mipmap.ic_launcher_round);
/*
设置item 不能用setMessage()
用setMultiChoiceItems
items : radioItems[] -> 多选选项数组
checkItems : isCheck[] -> 是否选中数组
listener -> 回调接口
*/
checkBoxDialog.setMultiChoiceItems(checkBoxItems, isCheck
, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked){
Toast.makeText(DialogActivity.this,
checkBoxItems[which] + " 选中",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(DialogActivity.this,
checkBoxItems[which] + " 未选中",Toast.LENGTH_SHORT).show();
}
}
});
//设置按钮
checkBoxDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
checkBoxDialog.create().show();
}
- 带输入框的弹窗
final EditText edit = new EditText(this);
AlertDialog.Builder editDialog = new AlertDialog.Builder(this);
editDialog.setTitle(getString(R.string.dialog_edit_text));
editDialog.setIcon(R.mipmap.ic_launcher_round);
//设置dialog布局
editDialog.setView(edit);
//设置按钮
editDialog.setPositiveButton(getString(R.string.dialog_btn_confirm_text)
, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(DialogActivity.this,
edit.getText().toString().trim(),Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
editDialog.create().show();
}
参考链接:https://www.cnblogs.com/Jetictors/p/7727103.html
6. 使用AlarmManager设置警告(闹钟)
Context. getSystemService(Context.ALARM_ SERVICE)
set(int type,long startTime,PendingIntent pi):一次性闹钟
setRepeating(int type,long startTime,long intervalTime,PendingIntent pi)
重复性闹钟
setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi) 重复性闹钟,时间不固定
cancel(PendingIntent pi) 取消AlarmManager的定时服务
- Type(闹钟类型)
AlarmManager.ELAPSED_REALTIME 系统相对时间(BootComplete开始计算),闹钟睡眠状态不可用;
AlarmManager.ELAPSED_REALTIME_WAKEUP 相对时间,休眠时间可用
AlarmManager.RTC 绝对时间
AlarmManager.RTC_WAKEUP 绝对时间,休眠可用
AlarmManager.POWER_OFF_WAKEUP 绝对时间,关机休眠可用
//System. currentTimeMillis()方法
- startTime 闹钟第一次执行时间,毫秒为单位,需与第一个Type参数匹配
- intervalTime 两次闹钟执行间隔
- PendingIntent 绑定了闹钟的执行动作,发送广播,启动activity,启动service
定义PendingIntent 对象
//启动ActivityIntent
PendingIntent pendingIntentAcitivy = PendingIntent.getActivities();
//启动ServiceIntent
PendingIntent pendingIntentService = PendingIntent.getService();
//发送BroadCastIntent广播
PendingIntent pendingIntentBroadCast = PendingIntent.getBroadcast();
7. 题目记录
1单选(1分)StateListDrawable资源文件中的item标记包括的属性有
- A.3个
- B.1个
- C.4个
- D.2个 1.00/1.00
2单选(1分)StateListDrawable的android:state_xxx属性值为
- A.整型
- B.布尔型
- C.每个属性不一样0.00
- D.字符型
3单选(1分)StateListDrawable的功能是
- A.列出组件所有的Drawable项
- B.根据状态来呈现不同的图像1.00/1.00
- C.设置组件所有可能使用的图像
- D.设置组件所有的Drawable项
4单选(1分)9-Patch图片是指
- A.图片可以最多可以贴9个补丁
- B.图片中有的部分被设置成可伸缩的,有的部分被设置成不可伸缩的。1.00/1.00
- C.图片有9个面片组成
- D.被分成9个部分的图片
5单选(1分)在主题资源文件中定义主题资源的标记是
- A.theme
- B.resourese
- C.item
- D.style1.00/1.00
6单选(1分)主题资源的功能是
- A.改变图片的内边距的大小
- B.设置窗口的背景1.00/1.00
- C.设置编辑框中文字的颜色
- D.改变按钮的颜色
7单选(1分)Android国际化的缩写是
- A.Internation-
- B.International……
- C.Inter……nation
- D.I18N1.00/1.00
8单选(1分)对于Toast下列说法正确的是
- A.按任一键会消失
- B.经过一定时间后自动消失1.00/1.00
- C.显示时会获得焦点
- D.一般有一个“确认”按钮
9单选(1分)Alert对话框有
- A.3种形式
- B.1种形式
- C.4种形式1.00/1.00
- D.2种形式
10单选(1分)创建只带有按钮的Alert对话框要使用
- A.AlertDialog类的create方法000
- B.AlertDialog.Builer.create方法
- C.AlertDialog类的构造方法
- D.使用AlertDialog.Builder的构造方法0.00/1.00
11单选(1分)StateListDrawable资源文件的根元素是
- A.
<StateListDrawable></StateListDrawable>
- B.
<resourses></resource>
- C.
<item></item>
- D.
<selector></selector>
12使用9-Patch图片的好处是
- A.防止图片被拉伸
- B.可以使用图片中任何一块Patch
- C.可以防止图像失真1.00/1.00
- D.防止图片被压缩
13下列哪个是样式资源的应用
- A.改变文本框显示文字的大小和颜色1.00/1.00
- B.只能设置组件的一个属性
- C.改变文本框中的文字
- D.改变窗口背景颜色
14对于Toast下列说法正确的是
- A.Toast只能用makeText创建
- B.可以使用构造方法创建Toast1.00/1.00
- C.Toast的对齐属性等不能设置
- D.Toast只能显示文字
15Alert对话框创建后
- A.要使用show方法显示1.00/1.00
- B.直接就显示了
- C.要使用create方法显示
- D.要使用builder.show方法显示