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)
关于弹出窗的介绍就到这里了,最后照例附上PopupWindow的国内镜像API
以上是关于Android学习笔记二十之Toast吐司Notification通知PopupWindow弹出窗的主要内容,如果未能解决你的问题,请参考以下文章