Android 用自定义PopupWindow实现自定义Toast

简介:

标题有点拗口,其实是可以分别写成两篇博文的。也就是说看完这篇能了解两个方面:

  • 自定义布局样式的Toast

  • 自定义PopupWindow实现多功能Toast

先感性认识:

触发事件来自于MenuItem的onClick,具体请看上一篇Android 自定义Menu


一 、自定义布局样式的Toast

布局文件dialog_toast.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<? xml  version = "1.0"  encoding = "utf-8" ?>
< RelativeLayout  xmlns:android = "http://schemas.android.com/apk/res/android"
     android:layout_width = "match_parent"
     android:layout_height = "match_parent"  >
     < TextView
         android:id = "@+id/dialog_title"
         android:textSize = "@dimen/dialog_toast_title_text_size"
         android:layout_width = "@dimen/dialog_toast_width"
         android:layout_height = "wrap_content"
         android:gravity = "center_horizontal"
         android:text = "@string/toast_dialog_title" />
     < TextView
         android:id = "@+id/dialog_content"
         android:layout_width = "@dimen/dialog_toast_width"
         android:layout_height = "wrap_content"
         android:drawableLeft = "@drawable/frog"
         android:drawableRight = "@drawable/fungus"
         android:layout_below = "@id/dialog_title"
         android:text = "@string/toast_dialog_content" />
</ RelativeLayout >

使用这个自定义布局,解决多次Toast重复弹出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
  * 显示自定义Toast<p>
  * private Toast mToast;<br/>
  * View toastView = mLayoutInflater.inflate(R.layout.dialog_toast, null);
  * @param toastView
  */
private  void  showToast(View toastView) {
     toastView.setBackgroundColor(Color.TRANSPARENT);
     if  (mToast ==  null ) {
         mToast =  new  Toast(mContext);
         mToast.setView(toastView);
         mToast.setGravity(Gravity.BOTTOM|Gravity.CENTER,  0 100 );
         mToast.setDuration(Toast.LENGTH_SHORT);
     }
     mToast.show();
}


二 、自定义PopupWindow实现多功能Toast

以下是MenuItem点击事件的完整代码,详细注释了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@Override
public  void  onClick(View v) {
     /** MenuItem dismiss */
     mPopWindow.dismiss();
     /**
      * 自定义PopupWindow模拟多功能Toast
      */
     View popToastView = mLayoutInflater.inflate(
             R.layout.dialog_toast,  null );
     mPopToast =  new  PopupWindow(popToastView,
             LayoutParams.WRAP_CONTENT,
             LayoutParams.WRAP_CONTENT,  true );
     mPopToast.setBackgroundDrawable( new  ColorDrawable(
             Color.TRANSPARENT));
     mPopWindow.setOutsideTouchable( true ); // 设置触摸外面时消失
     mPopToast
             .setAnimationStyle(android.R.style.Animation_Dialog); // 设置动画效果
     mPopToast.showAtLocation(v,
             Gravity.BOTTOM | Gravity.CENTER,  0 300 );
     /**
      * 用PopupWindow模拟Toast,里面的TextView的点击事件。
      * 因为Toast不获取焦点,所以View的事件无法处理。
      * 而PopupWindow解决了这个焦点问题。
      */
     TextView dialogContent = (TextView) popToastView
             .findViewById(R.id.dialog_content);
     dialogContent.setOnClickListener( new  OnClickListener() {
         @Override
         public  void  onClick(View v) {
             if  (mPopToast !=  null  && mPopToast.isShowing()) {
                 mPopToast.dismiss();
                 /** 再次显示自定义Toast, 这次是从PopupWindow里面的TextView触发的 */
                 View toastViewAgain = mLayoutInflater.inflate(
                         R.layout.dialog_toast,  null );
                 showToast(toastViewAgain);
             }
         }
     });
     /** 显示自定义Toast */
     View toastView = mLayoutInflater.inflate(
             R.layout.dialog_toast,  null );
     showToast(toastView);
}

使用PopupWindow实现的Toast可以不受Toast.LENGTH_SHORT或Toast.LENGTH_LONG的时间限制,并且可以得到焦点和用户交互,比如onClick等等。


Toast本身是一个非常便捷的提示组件,它的特点就是使用便捷,比如

1
Toast.makeText(mContext,  "123" , Toast.LENGTH_SHORT).show();

这样的一句代码就可以给出用户一个很友好的提示。

如果想做出复杂的交互功能,这些就不是Toast的定位了,需要自定义PopupWindow或者AlertDialog来实现,它们的定位在此。



本文转自chainli 51CTO博客,原文链接:http://blog.51cto.com/lichen/1216906,如需转载请自行联系原作者

相关文章
|
1月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
41 3
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
85 0
|
17天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
19天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
29 5
|
1月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
2月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
62 10
|
2月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
46 3
|
API Android开发
干货|APP自动化Android特殊控件Toast识别
干货|APP自动化Android特殊控件Toast识别
|
架构师 API Android开发
干货|APP自动化Android特殊控件Toast识别
Toast 是 Android 系统中的一种消息框类型,它属于一种轻量级的消息提示,常常以小弹框的形式出现,一般出现 1 到 2 秒会自动消失,可以出现在屏幕上中下任意位置。它不同于 Dialog,它没有焦点。Toast 的设计思想是尽可能的不引人注意,同时还向用户显示信息希望他们看到。 测试 APP 下载地址: 首先将上面地址的 apk 包下载到本地,并安装到模拟器中;在模拟器中打开 API
|
架构师 API Android开发
干货|APP自动化Android特殊控件Toast识别
Toast 是 Android 系统中的一种消息框类型,它属于一种轻量级的消息提示,常常以小弹框的形式出现,一般出现 1 到 2 秒会自动消失,可以出现在屏幕上中下任意位置。它不同于 Dialog,它没有焦点。Toast 的设计思想是尽可能的不引人注意,同时还向用户显示信息希望他们看到。 测试 APP 下载地址: 首先将上面地址的 apk 包下载到本地,并安装到模拟器中;在模拟器中打开 API
下一篇
无影云桌面