Project Url: o0o0oo00/Pudding
Introduction: :star2: Pudding use WindowManager(don't need request permission) to pull down a view that are displayed on top their attached window
More: Author   ReportBugs   

代替 Toast/SnackBar 新方式,使用 WindowManager 无需申请权限




allprojects {
    repositories {
     maven { url 'https://jitpack.io' }
   implementation 'com.github.o0o0oo00:Pudding:1.2.1'

GIF 可能要等会就顺畅了,一开始可能会比较迟钝 (●゚ω゚●)


Common configurable Pudding

Pudding.create(this) {
    setTitle("This is Title")
    setText("this is text")
Pudding.create(this) {
Pudding.create(this) {
    setTitle("Choco Title")
    setText("this is text")
Pudding.create(this) {
    setTitle("Choco Title")
    setText("This is Text , it's very short and I don't like short \n This is Text , it's very short and I don't like short")
    onShow {
        Toast.makeText(this@MainActivity, "onShowListener", Toast.LENGTH_SHORT).show()
    onDismiss {
        Toast.makeText(this@MainActivity, "onDismissListener", Toast.LENGTH_SHORT).show()


With FancyDialog, Pudding can be displayed above the shadow of Dialog.

每个 Activity 拥有各自的 Pudding,互相之间不影响

Each Activity has its own Pudding, which does not affect each other.

Imitate Alerter and ☆⌒(*^-゜)v THX!! a lot

what's different

Use activity decorView we can show a view on top of Activity。but when dialog is showing , its black background will cover the view , that is not cool. so i create this repository to solve this problem , and I hope it's useful to you

Something new

  • Use DSL style to config Choco
  • Show Queue
  • Cover Dialog/PopWindow
  • Don't need to request permission


  1. 两种 addView 方式

    • [x] activity decorView
    • [x] windowManager
      • [x] 动画显示
      • [x] 生命周期控制
      • [x] 有权限/无权限情况 (考虑到这个需求不是很大,而且每个项目的权限适配都不一致,而且国产手机权限这一块参差不齐,所以决定不做这一块了,对功能也没影响)
      • [x] 各个版本的适配
  2. 内部显示队列(考虑可以使用 kotlin 通道来实现)

    • [x] 上一条未消失时,后来一条等待
    • [x] 直接顶掉上一条,上一条渐变消失
  3. 左右/上下滑动消失动画

    • [x] 上下消失
    • [x] 左右滑动消失
  4. Pudding cover dialog


  • [x] Pudding使用的是 WindowManager 难道不需要申请权限吗?

    • [x] Pudding使用WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL的层级低于系统级层级TYPE_SYSTEM_ALERT也就是在 2000 之下,是不需要申请权限的。
  • [x] 不同的 Activity 对应的 WindowManager 是否相同

    • [x] 不同的 window,不同的 WindowManager,相同的 WindowManagerGlobal(最终实现 view 的添加、删除、更新)
  • [x] 不同的 WindowManager 为什么可以移除对方的 View

    • [x] 因为所有的 Activity 共同只有一个 WindowManagerGlobal(其内部持有所有添加的 View 的集合引用)
  • [X] 如何去维护一个 Pudding 队列

    • [x] 用一个Map<string,pudding>
    • [X] 什么时间 去 clear 这个 map (●゚ω゚●)挠头?
        when activity destory clean the key which is activity toString()
About Me
GitHub: Trinea
Facebook: Dev Tools