Android UI学习 - 用户通知

简介:

本文是在网上的文章《Android开发指南-用户界面-用户通知》的基础上添加内容的。里面的相同内容,版权归原翻译作者所有。

通知用户Notifying the User

    某些情况下需要通知用户你的应用程序中发生了一个事件。一些事件请求用户应答而另外一些则不需要。比如:

  • 当一个事件比如保存文件结束时,应该出现一条消息确认保存成功。(Toast适用)
  • 如果一个后台运行的应用程序需要用户关注,这个应用程序应该创建一个通知来允许用户在方便时进行应答。(后台程序,状态栏通知适用)
  • 如果这个应用程序在执行一个用户必须等待的任务(比如加载一个文件),那么应用程序应该显示一个盘旋的进度轮或进度条。(进度条Dialog适用)

    所有这些通知任务可以通过一个不同的技术获取到:

  • 一个消息条通知Toast Notification, 用于从后台出现的简短信息。for brief messages that come from the background.
  • 一个状态条通知A Status Bar Notification, 用于来自后台的持续提醒并请求用户应答
  • 个对话框通知A Dialog Notification, 用于活动相关的通知
 

消息条通知Toast Notification

    一个消息条通知是一个在窗口表面弹出的信息。它只填充内容所需的空间并且用户当前活动仍然保持可见和可交互。这个通知自动渐入渐出,而且不接受交互事件。因为消息条可以从一个后台服务Service中创建,即便应用程序不可见,它也将呈现出来。

Toast     Toast

默认的Toast    自定义的Toast

Toast的创建和显示都很简单,如果不使用自定义的view,只是显示文字,makeText函数就能做到了:

Toast.makeText(getApplicationContext(),   // Context context
               "This is a simple toast!", //显示的text或者引用resource.string的id
               Toast.LENGTH_LONG)         //显示的时间长度,
                                          //LENGTH_LONG - 时间长些,>1s;
                                          //LENGTH_SHORT- 时间短
     .show(); //显示出来
自定义Toast

而如果想使用custom view,首先要写个custom Layout xml文件(toastlayout.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_layout"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp"
    android:background="#DAAA"
    >
 
    <ImageView
        android:id="@+id/toast_icon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="10dp"
        android:src="@drawable/icon"
        />
 
    <TextView
        android:id="@+id/toast_text"
        android:layout_width="wrap_content" 
        android:layout_height="fill_parent"
        android:textColor="#FFF"
        />
 
</LinearLayout>

注意: TextView的layout_height设置为wrap_content的话,发现左边的图片会跟随文字内容的高度而变化,就是说当文字只有一行的时候,图片的高度就变得只有一行的高度,不好看!图片的src可以不在xml文件里面定义,可以在真正显示时用以下语句来设置:

ImageView image = (ImageView) layout.findViewById(R.id.image); 
image.setImageResource(R.drawable.android);

以下是显示custom toast view:

//加载Layout
View view = getLayoutInflater().inflate(
        R.layout.toastlayout,                         //resource id
        (ViewGroup) findViewById(R.id.toast_layout)); //ViewGroup对象
 
//设置Text
((TextView) view.findViewById(R.id.toast_text))
        .setText("This is a custom toast!"); 
 
//创建Toast
Toast toast = new Toast(getApplicationContext());
 
// 设置显示的位置 
toast.setGravity( 
        Gravity.CENTER_VERTICAL, //垂直居中
        0, //xOffset
        0  //yOffset
);
 
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(view); // ** 这个很重要
toast.show();

** 官方提示:只有使用custom view,setView(View)的时候,才使用new Toast(Content content)来得到Toast对象,否则必须用makeText(Context, int, int)方法来创建toast对象

消息条Toast是用来显示简短文本信息的最好方法,比如“文件已保存”,当你很确信用户正在关注屏幕时。一个消息条不能接受用户交互事件;如果你希望用户应答并采取相应动作,请考虑使用一个状态条通知Status Bar Notification。

状态条通知Status Bar Notification

    一个状态条通知添加一个图标到系统状态栏上(以及一个可选的滚动条文本信息)以及在这个“通知”窗口中的一个扩展消息。当用户选择这个扩展消息时,Android发出这个通知所定义的一个意图(通常是启动一个活动)。你也可以配置这个通知来通过一个声音,震动和设备上的闪烁灯来警告用户。

    当你的应用程序以后台服务运行并需要通知用户事件时,这类通知是一个理想的方式。如果你需要在活动仍处于焦点下时警告用户一个发生的事件,请考虑使用对话框通知Dialog Notification 。

notification

自定义View和默认的Notification

状态栏Notification的创建流程大概是这样的:

// 获取NotificationManager
mNotificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 
// 创建PendingIntent, 明确响应后转向的Activity
contentIntent = PendingIntent.getActivity(
                getApplicationContext(),
                0,
                new Intent(getApplicationContext(),
                        FrameDemo.class), //响应Notification转向的Activity
                0); 
 
//实例化一个Notification,并指定其图标和标题(在提示栏上显示)
mNotification = new Notification(
    R.drawable.icon, // icon
    "Notification",  // 状态栏上显示的滚动提示文字tickerText
    System.currentTimeMillis());//Notification计划执行的开始时间
 
//设置Notification的Title和详细内容(打开提示栏后在通知列表中显示)
mNotification.setLatestEventInfo(
    getApplicationContext(),
    "Notification open", // Title
    "This is a simple notification", //content
    contentIntent);      //PendingIntent是在这时候用的
 
//100 毫秒延迟后,震动 250 毫秒,暂停 100 毫秒后,再震动 500 毫秒
mNotification.vibrate = new long[] { 100, 250, 100, 500 };
//mNotification.defaults |= Notification.DEFAULT_VIBRATE; //或者设置默认的震动效果
 
//设置闪灯绿光,也可以设置默认的效果,请参考API DOC
mNotification.ledARGB = 0xff00ff00;
mNotification.ledOnMS = 300;
mNotification.ledOffMS = 1000;
mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
 
//设置声音,可以选择以下任一方式,但要注意,当defaults已经包含了DEFAULT_SOUND,将覆盖之前指定的音频文件的设置
mNotification.defaults |= Notification.DEFAULT_SOUND; //系统默认的通知声音
//mNotification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); //或者指定某个音频文件
 
//设置声音持续重复,直至用户点击或者清除通知
mNotification.flags |= Notification.FLAG_INSISTENT;
 
//最后一步: NotificationManager发出通知
mNotificationManager.notify(
        R.id.notice1,  //该Notification的ID
        mNotification);
清除通知Clear

    如果需要把Notification清除(clear),则调用NotificationManager.cancel(Notification的ID),或者直接NotificationManager.clearAll()清除所有。也可以添加Notification对象的FLAG_AUTO_CANCEL属性来自动清除。

更新通知Update the notification

    可以通过notification对象的setLatestEventInfo()方法来修改/更新信息,也可以通过其他函数来修改notification对象的属性,最后是调用NotificationManager.notify(原来的ID, 修改/更新后的notification对象)完成的。

//修改Title & content
mNotification.setLatestEventInfo(
    getApplicationContext(),
    "Notification update", // Title
    "This is the second notification", //content
    contentIntent);
 
//修改Icon
mNotification.icon = R.drawable.robot;
 
//设置自动清除
mNotification.flags |= Notification.FLAG_AUTO_CANCEL;
 
//重新发出通知
mNotificationManager.notify(R.id.notice1, mNotification);
自定义view的Notification

首先定义Layout xml文件(notifylayout.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/notify_layout"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="3dp"
    >
 
    <ImageView 
        android:id="@+id/notify_image"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="10dp"
        />
 
    <TextView 
        android:id="@+id/notify_text"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:textColor="#000"
        />
 
</LinearLayout>

 然后使用RemoteView加载Layout,并设置Image,Text:

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notifylayout);
contentView.setImageViewResource(R.id.notify_image, R.drawable.robot);
contentView.setTextViewText(R.id.notify_text, "Hello, this message is in a custom expanded view");
 
Notification notification = new Notification(
    R.drawable.icon, //icon
    "Notification", // 状态栏上显示的提示文字
    System.currentTimeMillis());
notification.contentIntent = contentIntent;
notification.contentView = contentView; //就是这里不同,set view
 
// 以R.layout.notify_layout为ID
mNotificationManager.notify(R.layout.notifylayout, notification);

    官方提示,使用custom view的Notification要注意在不同规格的屏幕下的显示效果。个人认为,Notification的自定义View用途不大。更详细的内容可以查阅http://androidappdocs.appspot.com/guide/topics/ui/notifiers/notifications.html

 

对话框通知Dialog Notification

    一个对话框通常是出现在当前活动前面的一个小窗口。背后的活动丢失焦点而由这个对话框接受所有的用户交互。对话框通常用做和运行中应用程序直接相关的通知和短暂活动。

    你应该使用对话框来显示一个进度条或者一个需要用户确认的短消息(比如带有“确认”和“取消”按钮的一个警告)。你也可以把对话框作为构成应用程序界面整体的组件以及用于除了通知之外的其它目的。

    如何使用对话框通知,请参考对话框Dialoghttp://android.blog.51cto.com/268543/333769


本文转自 Icansoft 51CTO博客,原文链接: 

http://blog.51cto.com/android/333573
相关文章
|
1月前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
66 4
|
11月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
10月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
11月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
249 2
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
174 7
第一个安卓项目 | 中国象棋demo学习
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
302 1
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
Android开发
Android学习 —— 测试init.rc中的条件触发的处理顺序
Android学习 —— 测试init.rc中的条件触发的处理顺序
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
370 0
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
316 1

热门文章

最新文章