开发者社区> 科技小先锋> 正文

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

简介:
+关注继续查看

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

  • 自定义布局样式的Toast

  • 自定义PopupWindow实现多功能Toast

先感性认识:

232014970.gif

触发事件来自于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, 0100);
        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, 0300);
    /**
     * 用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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19023 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13725 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
16776 0
Android自定义组件之ListPopWindow
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/50582900 最近小编在学习IOS开发,感触颇深,看到了iOS里面封装了好多组件,很多组件都是iOS自带的,相信一般的小公司的产品经理都是按照iOS的交互来设计UI,而且还要求Android要和iOS统一风格,这让Android开发人员很头痛,iOS自带组件很容易实现,而Android可能需要重写控件去配合iOS的效果。
777 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
23886 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14068 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载