定制Android Toast显示时间:三种实现方法详解

11 下载量 188 浏览量 更新于2023-05-12 收藏 66KB PDF 举报
在Android开发中,自定义Toast的显示时间是一项常见的需求,尤其是在需要对用户提示信息进行更精确控制的应用场景。标准的Toast提供了LENGTH_LONG(长)和LENGTH_SHORT(短)两种预设时长,但这并不满足所有开发者对于定制化的需求。本文将重点介绍如何通过WindowManager类实现自定义Toast的显示时间,以解决这一问题。 首先,我们来理解为什么要自定义显示时间。原生的Toast通常没有提供设置具体时长的功能,开发者如果希望改变其显示时间,可能需要采取一些间接的方法。本文提到的三种实现方式中,我们选择第三种,即使用WindowManager类,因为这种方法相对简单且易于理解。 以下是如何通过自定义的CToast类来实现这一功能: 1. 创建一个名为CToast的公共静态方法`makeText(Context context, CharSequence text, int duration)`,接受一个Context对象、要显示的文字和自定义的时长作为参数。 2. 在makeText方法内部,实例化一个新的CToast对象,并创建一个LinearLayout来承载TextView。LinearLayout的布局背景可以使用预定义的资源R.drawable.widget_toast_bg,增加Toast的视觉效果。 3. 创建一个TextView并设置文本、颜色和居中对齐。这里将文字颜色设置为白色,以确保在不同背景下清晰可见。 4. 将TextView添加到LinearLayout中,然后设置LinearLayout的背景。 5. 接下来,我们需要利用WindowManager来动态管理这个自定义的Toast。创建一个Handler对象,它将负责在指定的时间后隐藏Toast。使用Handler的postDelayed方法,在`duration`毫秒后执行一个匿名Runnable,该Runnable会调用`dismiss()`方法来关闭Toast。 6. 最后,将LinearLayout设置为WindowManager的窗口属性,通过`set WindowManager.LayoutParams`设置其位置、大小等,并将窗口类型设为`PixelFormat.TRANSLUCENT`,使其透明以便于显示在其他内容之上。 以下是一个简化的自定义CToast的示例代码片段: ```java private void showToast(Context context, String text, int duration) { CToast.makeText(context, text, duration).show(); } public void showWithCustomDuration(Context context, String text, int duration) { Handler handler = new Handler(); Runnable dismissRunnable = new Runnable() { @Override public void run() { WindowManager.LayoutParams params = mLayout.getLayoutParams(); params.removeFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); params.removeFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); wm.removeView(mLayout); } }; // 创建并显示自定义Toast final CToast cToast = CToast.makeText(context, text, duration); mLayout.setGravity(Gravity.CENTER, 0, 0); mLayout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); mLayout.layout(0, 0, mLayout.getMeasuredWidth(), mLayout.getMeasuredHeight()); // 设置窗口属性 mLayout.setWindowFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_DIM_BEHIND); mLayout.setAlpha(0f); WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, PixelFormat.TRANSLUCENT, WindowManager.LayoutParams.TYPE_TOAST, 0 ); layoutParams.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; // 添加到WindowManager并延迟关闭 handler.postDelayed(dismissRunnable, duration); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); wm.addView(mLayout, layoutParams); } ``` 总结来说,自定义Android Toast的显示时间需要通过WindowManager来实现,通过创建一个可延时消失的窗口来模拟。通过这种方式,开发者可以根据应用需求灵活地控制Toast的显示时长,提升用户体验。