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

Posted wenzhang1102

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android学习笔记二十之Toast吐司Notification通知PopupWindow弹出窗相关的知识,希望对你有一定的参考价值。

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

以上是关于Android学习笔记二十之Toast吐司Notification通知PopupWindow弹出窗的主要内容,如果未能解决你的问题,请参考以下文章

java [Toast吐司] #Android

Android消息的提示,Toast吐司方式

吐司Toast

为啥我的失败吐司在android kotlin中不断出现

在android视图中的任何地方长按时如何创建吐司?

Android Toast小解