定制Android Toast显示时间:三种实现方法详解
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的显示时长,提升用户体验。
2015-09-09 上传
2014-07-19 上传
2021-01-20 上传
2016-08-21 上传
2019-07-10 上传
106 浏览量
2021-04-06 上传
2021-01-20 上传