关闭

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

标签: android控件吐司-通知-弹出框
4687人阅读 评论(1) 收藏 举报
分类:

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Toast吐司

  Toast吐司是我们经常用到的一个控件,Toast是AndroidOS用来显示消息的一种机制,它与Dialog不同,Toast不会获取到焦点,通常显示一段时间之后就会自动消失,下面我们来介绍Toast的几种常用方式:

第一种,默认显示方式,也是最常用的方式:

 Toast.makeText(MainActivity.this, "这是默认的显示方式", Toast.LENGTH_SHORT).show();

第二种,自定义设置位置的显示方式:

Toast toast = Toast.makeText(MainActivity.this, "这是自定义显示位置的效果", Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER, 0, 0);
toast.show();

第三种,带图片显示:

 Toast toast = Toast.makeText(MainActivity.this, "这是带图片的效果", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER, 0, 0);
LinearLayout linearLayout = (LinearLayout) toast.getView();
ImageView imageView = new ImageView(MainActivity.this);
imageView.setImageResource(R.mipmap.ic_launcher);
linearLayout.addView(imageView, 0);
toast.show();

第四种,完全自定义显示方式:

 LayoutInflater layoutInflater = getLayoutInflater();
View toastView = layoutInflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.ll_toast));
Toast toast = new Toast(MainActivity.this);
toast.setDuration(Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setView(toastView);
toast.show();

布局文件代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_toast"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16sp"
android:layout_marginTop="16sp"
android:gravity="center"
android:orientation="horizontal">

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/ic_launcher" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="这是完全自定义的吐司"
    android:textSize="20sp" />
</LinearLayout>

第五种,其他线程通过handler显示:

new Thread(new Runnable() {
@Override
public void run() {
handler.sendEmptyMessage(1);
}
}).start();

public void showToast() {
    Toast.makeText(MainActivity.this, "这是来自其它线程的吐司", Toast.LENGTH_SHORT).show();
}
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == 1) {
            showToast();
        }
        super.handleMessage(msg);
    }
};

实现效果图:

猛戳下载源码

最后附上Toast的国内镜像API

Notification通知

  Notification是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification。在AndroidAPI3.0之前,推荐使用Notification.Builder构建一个消息,但是在3.0之后,推荐使用NotificationCompat.Builder构建。

下面我们介绍一下Notification的基本使用方法:

通知主要涉及到两个类:

  • Notification类:通知信息类,它用于承载通知的内容,一般我们不直接构建这个对象,而是使用它的一个内部类NotificationCompat.Builder来实例化一个对象(Android3.0之下使用Notification.Builder),并设置通知的各种属性,最后通过NotificationCompat.Builder.build()方法得到一个Notification对象。当获得这个对象之后,可以使用NotificationManager.notify()方法发送通知。
  • NotificationManager类:是一个通知管理器类,这个对象是由系统维护的服务,是以单例模式获得,所以一般并不直接实例化这个对象。在Activity中,我们直接传入Context.NOTIFICATION_SERVICE就可以通过调用Activity.getSystemService(String)方法获取NotificationManager对象。

通知设置的相关方法:

  • setContentTitle(CharSequence):设置标题,必须要设置
  • setContentText(CharSequence):设置内容,必须要设置
  • setSmallIcon(int):设置在接收到通知的时候顶部显示的小图标,必须要设置
  • setSubText(CharSequence):设置内容下面一小行的文字
  • setTicker(CharSequence):设置收到通知时在顶部显示的文字信息
  • setLargeIcon(Bitmap):设置大图标
  • setAutoCancel(boolean):用户点击Notification点击面板后是否让通知取消(默认不取消)
  • setDefaults(int):向通知添加声音、闪灯和振动效果的最简单、 使用默认(defaults)属性,可以组合多个属性,Notification.DEFAULT_VIBRATE(添加默认震动提醒);Notification.DEFAULT_SOUND(添加默认声音提醒);Notification.DEFAULT_LIGHTS(添加默认三色灯提醒);Notification.DEFAULT_ALL(添加默认以上3种全部提醒)
  • setVibrate(long[]):设置振动方式
  • setLights(int argb, int onMs, int offMs):设置三色灯,参数依次是:灯光颜色, 亮持续时间,暗的时间
  • setSound(Uri):设置接收到通知时的铃声,可以用系统的,也可以自己设置
  • setOngoing(boolean):设置为ture,表示它为一个正在进行的通知
  • setProgress(int,int,boolean):设置带进度条的通知 参数依次为:进度条最大数值,当前进度,进度是否不确定 如果为确定的进度条
  • setContentIntent(PendingIntent):PendingIntent和Intent略有不同,它可以设置执行次数, 主要用于远程服务通信、闹铃、通知、启动器、短信中,在一般情况下用的比较少
  • setPriority(int):设置优先级

使用Notification的步骤:

  • 第一步:获得一个NotificationManager对象,
  • 第二步:创建一个通知栏的Builder构造类
  • 第三步:对Builder进行相关的设置,通过用上面介绍的相关方法
  • 第四步:调用Builder的build()方法为notification赋值
  • 第五步:调用NotificationManager的notify()方法发送通知

注意:Android系统提供两种取消通知的方法:一种是Notification自己维护,使用setAutoCancel()方法设置是否维护,传递一个boolean类型的数据。另外一种方式使用NotificationManager通知管理器对象来维护,它通过notify()发送通知的时候,指定的通知标识Id来操作通知,可以使用cancel(int)来移除一个指定的通知,也可以使用cancelAll()移除所有的通知。

下面我们通过实现一个简单的例子来体验Notification的用法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mContext = MainActivity.this;
    btn_default_notification = (Button) findViewById(R.id.btn_default_notification);
    btn_default_notification.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(mContext, DefaultActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
            NotificationManager notificationManager = (NotificationManager) MainActivity.this.getSystemService(NOTIFICATION_SERVICE);
            Notification.Builder builder = new Notification.Builder(MainActivity.this);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setContentTitle("默认消息通知");
            builder.setContentText("我是默认显示的消息,我进来了");
            builder.setWhen(System.currentTimeMillis());
            builder.setTicker("接受到一条信息");
            builder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);
            builder.setAutoCancel(true);
            builder.setContentIntent(pendingIntent);
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
                Notification notification = builder.build();
                notificationManager.notify(NOTIFICATION, notification);
            }

        }
    });
}

这里的话就只放Java的代码,其他的就不再设置了,也比较简单。

猛戳下载源码

照例附上Notification的国内镜像API

PopupWindow弹出窗

  PopupWindow这个类用来实现一个弹出框,PopupWindow可以加载任意内容的View,这个弹出框是悬浮在当前activity之上的。如果PopupWindow显示了,那么所有的事件都会被其拦截,除了home的之外,例如:一个PopupWindow弹出了,那么你需要点击手机上的退出键让PopupWindow消失,然后Activity才会退出。

下面我们通过一个例子来体验一下PopupWindow:

Activity代码:

package com.example.popupwindow;

import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
private Button btn_show_pop;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn_show_pop = (Button) findViewById(R.id.btn_show_pop);
    btn_show_pop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            initPop(view);
        }
    });
}

private void initPop(View view) {
    View popView = LayoutInflater.from(MainActivity.this).inflate(R.layout.pop_custom, null);
    Button btn_01 = (Button) popView.findViewById(R.id.btn_01);
    Button btn_02 = (Button) popView.findViewById(R.id.btn_02);
    Button btn_03 = (Button) popView.findViewById(R.id.btn_03);
    //初始化一个PopupWindow,第一个参数是加载的View,第二个参数是View的宽度,第三个参数是View的高度,第四个是是否获取焦点
    final PopupWindow popupWindow = new PopupWindow(popView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
    //设置加载动画
    popupWindow.setAnimationStyle(R.anim.pop_anim);
    //设置可以点击空白处让PopupWindow消失
    popupWindow.setOutsideTouchable(true);
    popupWindow.setTouchable(true);

    popupWindow.setTouchInterceptor(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            System.out.println("touch");
            //这里如果返回true的话,touch事件将被拦截
            return false;
        }
    });
    //设置背景颜色
    popupWindow.setBackgroundDrawable(new ColorDrawable(0x00ff0000));
    //设置PopupWindow显示的位置,第一个参数是相对的View,第二个是X轴,第三个参数是Y轴
    //showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
    //showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
    //showAtLocation(View parent, int gravity, int x, int y): 相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移 PS:parent这个参数只要是activity中的view就可以了!
    popupWindow.showAsDropDown(view, 40, 0);
    btn_01.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "你点击了水果", Toast.LENGTH_SHORT).show();
            popupWindow.dismiss();
        }
    });
    btn_02.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "你点击了运动", Toast.LENGTH_SHORT).show();
            popupWindow.dismiss();
        }
    });
    btn_03.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(MainActivity.this, "你点击了吃饭", Toast.LENGTH_SHORT).show();
            popupWindow.dismiss();
        }
    });
}
}

布局文件代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<Button
    android:id="@+id/btn_01"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="水果" />

<Button
    android:id="@+id/btn_02"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="运动" />

<Button
    android:id="@+id/btn_03"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:text="吃饭" />

</LinearLayout>

实现效果:

其中,PopupWindow有9种构造方法,如下图所示:

我们常用就一下几种:

public PopupWindow (Context context)
public PopupWindow(View contentView, int width, int height)
public PopupWindow(View contentView)
public PopupWindow(View contentView, int width, int height, boolean focusable)

猛戳下载Demo源码

关于弹出窗的介绍就到这里了,最后照例附上PopupWindow的国内镜像API

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗

Android学习笔记二十之Toast吐司、Notification通知、PopupWindow弹出窗
  • solo_talk
  • solo_talk
  • 2016-07-05 14:36
  • 4687

解决Android关闭通知消息权限无法弹出Toast的问题

最近在做项目时,遇到一个问题,有部手机就是Toast弹不出来。仔细想想可能权限的问题。后面网上搜索给出如下答案: 跟踪Toast的源代码,make方法省略,做了一些初始化的工作,show方法 ...
  • a3676212
  • a3676212
  • 2016-07-05 12:51
  • 8552

自定义吐司以及Toast的各种用法,详解。教你学会使用各种各样的Toast

package com.david_Custoast; import com.david_Custoast.R; import android.app.Activity; import and...
  • qq_21376985
  • qq_21376985
  • 2016-03-21 18:54
  • 1530

2014-10-27Android学习------布局处理(八)------自定义吐司(Toast)-----城市列表应用程序

我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的学习源码是网上找的个CityList 源码 百度搜就知道很多下载的地方 有时候我们需要
  • u014737138
  • u014737138
  • 2014-10-29 19:48
  • 602

Android学习笔记(五四):通知Notification(上)

运行在后台的Service,需要某种方式来通知用户,例如通知用户来电,通知有新的消息。这类的通知显示在status bar上,还可以带有硬件的提醒,例如振动、LED灯闪,播放声音等等。在Android...
  • flowingflying
  • flowingflying
  • 2013-02-28 17:33
  • 14320

Android学习笔记(五五):通知Notification(下)

Notification除了用于后台服务通知,还常用在下面情况: (1)保持服务存在。当系统内存不足时,系统会认为某后台服务占用内存时间太长而中止该服务,以释放内存。对于某些服务,例如播放音...
  • xifeng1011
  • xifeng1011
  • 2014-06-16 10:02
  • 288

Android学习笔记 通知Notification

Notification是Android系统为通知用户某些进程发生改变时用到的工具类。Android手机在收到短信是都会在屏幕上方出现短信息的缩略内容,以及其他的消息通知或者是推送信息都将首先以通知的...
  • Tom_xiaoxie
  • Tom_xiaoxie
  • 2015-11-11 19:42
  • 516

android学习笔记(14)Status Bar Notification 状态栏、通知栏推送

Status Bar Notification 添加一个icon到系统状态栏中(可选择是否有文本信息),添加一段信息到Notification(通知栏)窗口中 当在后台运行的服务需要与用户进行交互时...
  • sac761
  • sac761
  • 2015-09-05 13:38
  • 1471

Android的各种通知Notification、Dialog、Toast、Snackbar

  • 2017-08-11 14:06
  • 267KB
  • 下载

Android自定义Dialog,Toast,Notification和PopupWindow

写了一个小Demo,实现了自定义Toast和Notification的基本使用,现在总结一下: 文章末尾有代码链接,首先贴个效果图,下拉通知里面的是Notification,居中的是自定义的Toas...
  • zhoumushui
  • zhoumushui
  • 2014-09-22 19:22
  • 6433
    个人资料
    • 访问:82281次
    • 积分:1428
    • 等级:
    • 排名:千里之外
    • 原创:65篇
    • 转载:0篇
    • 译文:0篇
    • 评论:15条
    最新评论