android学习笔记二十之toast吐司notification通知popupwindow弹出窗

wenzhang1102 wenzhang1102     2022-07-31     644

关键词:

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

吐司toast

调用Button1.res-layout: android:onClick="Button"2.src:publicvoidButton(Viewview){Toast.makeText(this,"内容",1).show();}匿名类src:Buttonb1;b1=(Button)findViewById(R.id.button);b1.setOnClickListen(newOnCl 查看详情

慕课网实战sparkstreaming实时流处理项目实战笔记二十之铭文升级版

铭文一级:SpringBoot整合Echarts动态获取HBase的数据1)动态的传递进去当天的时间 a)在代码中写死 b)让你查询昨天的、前天的咋办? 在页面中放一个时间插件(jQuery插件),默认只取当天的数据2)自动刷新展示图 每隔多久发送一个... 查看详情

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

】为啥我的失败吐司在androidkotlin中不断出现【英文标题】:whymyfailuretoastappearscontinuouslyinandroikotlin为什么我的失败吐司在androidkotlin中不断出现【发布时间】:2022-01-1817:07:53【问题描述】:我不知道如何让我的失败toast消息只显示... 查看详情

搜索结果不匹配时,android中没有数据吐司

】搜索结果不匹配时,android中没有数据吐司【英文标题】:Nodatatoastinandroidwhilesearchresultsdonotmatch【发布时间】:2019-03-2713:37:28【问题描述】:我已经实现了可过滤。我已经检查了onPublished上的过滤结果,即if(filterResults.count==0)和... 查看详情

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

】在android视图中的任何地方长按时如何创建吐司?【英文标题】:Howcanicreateatoastwhenlongpressanywhereintheviewinandroid?【发布时间】:2014-07-0107:02:01【问题描述】:您好,当我们长按应用程序视图中的任意位置时,我需要创建一个toast... 查看详情

如何在长按工具栏项目(图标)android时隐藏Toast消息的显示?

】如何在长按工具栏项目(图标)android时隐藏Toast消息的显示?【英文标题】:HowtohidethedisplayofToastmessage,onlongpressofToolBaritem(icon)android?【发布时间】:2015-10-0406:34:17【问题描述】:长按工具栏项后有什么方法可以隐藏吐司吗?and... 查看详情

吐司消息样式变化?只有 Toast 消息没有 Snackbar 其他没有小部件

】吐司消息样式变化?只有Toast消息没有Snackbar其他没有小部件【英文标题】:ToastMessageStyleChangeinflutter?OnlyToastMessagenotSnackbarOtherNoWidgets【发布时间】:2021-09-0908:20:54【问题描述】:目前,我正在尝试开发一个应用程序。而且我不... 查看详情

小吃店与吐司

...arvsToast【发布时间】:2018-09-1302:42:55【问题描述】:我是android开发的新手,我对Context和View感到困惑。所以,我只想知道为什么我们在Snackbar中传递视图而在Toast中传递上下文,而我们同时使用两者来显示通知/消息。【问题讨论... 查看详情

toast是啥意思

toast是Android系统中一种消息框类型拓展资料Android中的Toast是一种简易的消息提示框。当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。用户将可能是在中间键入别的东西。Toa... 查看详情

爬虫学习笔记(二十一)——appium(代码片段)

...移动App(手机应用)自动化工具。支持iOS平台和Android平台上的原生应用,web应用和混合应用。它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了iOS和Android... 查看详情

Android 小部件按钮 Onclick Toast 消息

】Android小部件按钮OnclickToast消息【英文标题】:AndroidWidgetButtonClickToastMaessage【发布时间】:2013-12-0823:58:51【问题描述】:我创建了一个简单的小部件,只有一个按钮和textView。当我第一次将我的小部件添加到主屏幕时,会出现... 查看详情

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

packagecom.david_Custoast;importcom.david_Custoast.R;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.Gravity;importandroid.view.LayoutInflater;importandroid.view.View;importandro 查看详情

Android Studio Chaquopy 吐司消息

】AndroidStudioChaquopy吐司消息【英文标题】:AndroidStudioChaquopytoastmessage【发布时间】:2021-09-0620:05:41【问题描述】:我正在尝试在AndroidStudio中使用Python。所以,我为此使用了Chaquopy。但是Chaquopy中存在一个问题,当我运行我的应用... 查看详情

来自 JobIntentService 的吐司

...()的线程上烤面包”我想在jobintentservice中与处理程序一起学习请帮帮我 查看详情

剑指offer二十之包含min函数的栈

一、题目  定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。二、思路用一个栈dataStack保存数据,用另外一个栈minStack保存依次入栈最小的数。每次元素存入minStack的时候,如果该元素比minStack的栈顶元... 查看详情

如何等到吐司完成?仅在 toast 隐藏 prev 测试后才开始第二次测试

】如何等到吐司完成?仅在toast隐藏prev测试后才开始第二次测试【英文标题】:Howwaituntiltoastisfinish?Startsecondtestonlyaftertoastwashideofprevtest【发布时间】:2019-05-0212:09:04【问题描述】:这里是我的Espresso测试:@RunWith(AndroidJUnit4::class)c... 查看详情

如何在android小部件中单击图像按钮显示吐司

】如何在android小部件中单击图像按钮显示吐司【英文标题】:Howtodisplayatoastonimagebuttonclickinandroidwidget【发布时间】:2017-06-2923:37:30【问题描述】:我正在创建一个有按钮的小部件!当我点击一个按钮时。它只是读取我的位置并... 查看详情

Toastr:如何防止鼠标悬停时粘糊糊的吐司淡出?

】Toastr:如何防止鼠标悬停时粘糊糊的吐司淡出?【英文标题】:Toastr:Howtopreventfadeoutwithstickytoastonmouseover?【发布时间】:2013-06-2823:16:20【问题描述】:我一直在玩toastr并已成功将超时设置为0,因此toast保持粘性,但是当我将鼠... 查看详情