【android编程】第十讲用户资源、通知、对话框和警告

第十讲用户资源&通知、对话框和警告

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显示消息提示框

  1. 构造方法:
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();
    }

  1. 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() 用于为对话框添加多选列表项
  1. 普通对话框
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();
  }
  1. 普通对话框(多按钮)

在系统对话框中最多出现三个按钮,即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();
  }
  1. 普通列表对话框
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();
  }
  1. 单选对话框
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();
  }
  1. 多选对话框
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();
  }
  1. 带输入框的弹窗
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方法显示
发布了88 篇原创文章 · 获赞 53 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/xbean1028/article/details/105099164