弹窗系列:Toast类如何实现在任意Activity上显示提示?

  • 关于Toast源码中,如何一步一步实现显示提示, 这篇文章 Android Toast源码分析 写得很详细,可以参考。
  • 我们能不能根据Toast源码中的原理,自己实现一个简单的Toast提示了?当然可以。参考这篇文章:使用WindowManager自定义toast
  • 下面贴出,我改进后的代码:

public class Toast {
    public static final int LENGTH_SHORT = 0;
    public static final int LENGTH_LONG = 1;
    private static final int LONG_DELAY = 3500; 
    private static final int SHORT_DELAY = 2000; 
    private static Context context;
    private static WindowManager windowManager;

    public static Toast init(Context context) {
        Toast toast = new Toast();
        Toast.context = context.getApplicationContext();
        windowManager = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        return toast;
    }

    public void show(String text) {
        show(text, LENGTH_SHORT);
    }

    public void show(final String text, int length) {
        final TextView textView = new TextView(context);
        textView.setBackgroundResource(android.R.drawable.toast_frame); //设置成官方原生的 Toast 背景
        textView.setText(text);

        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.type = WindowManager.LayoutParams.TYPE_TOAST;
        lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; //设置这个 window 不可点击,不会获取焦点,这样可以不干扰背后的 Activity 的交互。
        lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        lp.format = PixelFormat.TRANSLUCENT; //这样可以保证 Window 的背景是透明的,不然背景可能是黑色或者白色。
        lp.windowAnimations = android.R.style.Animation_Toast; //使用官方原生的 Toast 动画效果

        windowManager.addView(textView, lp);
        textView.postDelayed(new Runnable() { // 指定时间后,取消 Toast 显示
            @Override
            public void run() {
                windowManager.removeView(textView);
            }
        }, length == LENGTH_SHORT ? SHORT_DELAY : LONG_DELAY);
    }

}
使用方法:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.init(MainActivity.this).show("hhh");
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangjin1120

可靠的文章费时费力,希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值