怎么实现toast中的hide方法

html-css07

怎么实现toast中的hide方法,第1张

在android中toast是一个很好用的控件,可以很方便的通知用户现在手机在做什么或是你已经做了什么或是在做什么就会怎么样......。

最近无事总结一下其使用方法。 我们一般的使用方法如下:

[java] view plain copy print?

Toast.makeText(this, "测试", Toast.LENGTH_SHORT).show()

这也是最简单的使用方法,其实Toast还有一些比较高级的使用方法

1、设置Toast在屏幕中的显示的位置

ToastAPI中有一个setGravity(int gravity, int xOffset, int yOffset)方法此方法可以完成对Toast显示位置的控制

第一个参数gravity可以使用Gravity类中提供的一些参数例如Gravity.TOP 、Gravity.LEFT、Gravity.RIGHT、Gravity.CENTER_HORIZONTAL.......

xOffset、yOffset 参数主要和Gracity实现的功能一样但是要比Gravity要强大。Gravity可以定义在屏幕的顶部、中间或是下部。

xOffset、yOffset 可以定义到屏幕的具体的位置,如果你不想他在设置中起作用都设置为0就可以了。在设置完Gravity的属性后 xOffset 负责水平位置的定位,

负值表示显示偏左,正值显示偏右。yOffset 负值表示偏上 正值表示偏下。

例如

[java] view plain copy print?

Toast toast = Toast.makeText(this, "test", Toast.LENGTH_SHORT)

toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0)

toast.show()

2、自定义Toast的布局,如果你不喜欢android系统自己带的Toast布局你完全可以自己定义一个显示的方式哦

ToastAPI中有一个setView(View view)方法

[java] view plain copy print?

Context context = getApplicationContext()

String msg = "test"

int duration = Toast.LENGTH_LONG

Toast toast = Toast.makeText(context, msg, duration)

toast.setGravity(Gravity.TOP, 0, 0)

LinearLayout ll = new LinearLayout(context)

ll.setOrientation(LinearLayout.VERTICAL)

Button button = new Button(context)

button.setText(msg)

int lHeight = LinearLayout.LayoutParams.FILL_PARENT

int lWidth = LinearLayout.LayoutParams.WRAP_CONTENT

ll.addView( button , new LinearLayout.LayoutParams(lHeight, lWidth))

ll.setPadding(40, 50, 0, 50)

toast.setView(ll)

toast.show()

这样就把button显示成了一个Toast,我是为了演示你可以自定义一个View

去显示你自己想显示的Toast

3、自定义显示Toast的显示时间 Toast的显示时间ToastAPI没有给出一个接口或是方法去设置和调用,

哪我们怎么去设置呢。通过查看Toast的源代码你可以发现一些东西下面是 Toast中show()方法的源代码

[java] view plain copy print?

/**

* Show the view for the specified duration.

*/

public void show() {

if (mNextView == null) {

throw new RuntimeException("setView must have been called")

}

INotificationManager service = getService()

String pkg = mContext.getPackageName()

TN tn = mTN

tn.mNextView = mNextView

try {

service.enqueueToast(pkg, tn, mDuration)

} catch (RemoteException e) {

// Empty

}

}

从中我们可以看到他把tn添加到了service的Toast处理队列中。哪我们是肯定是改不了的了 INotificationManager 是一个接口

[java] view plain copy print?

interface INotificationManager

{

void enqueueNotification(String pkg, int id, in Notification notification, inout int[] idReceived)

void cancelNotification(String pkg, int id)

void cancelAllNotifications(String pkg)

void enqueueToast(String pkg, ITransientNotification callback, int duration)

void cancelToast(String pkg, ITransientNotification callback)

}

它的实现类是 NotificationManagerService 通过查看这个类可以看出一点端倪

[java] view plain copy print?

public void enqueueToast(String pkg, ITransientNotification callback, int duration)

{

if (DBG) Slog.i(TAG, "enqueueToast pkg=" + pkg + " callback=" + callback + " duration=" + duration)

if (pkg == null || callback == null) {

Slog.e(TAG, "Not doing toast. pkg=" + pkg + " callback=" + callback)

return

}

final boolean isSystemToast = ("android".equals(pkg))

if (ENABLE_BLOCKED_TOASTS &&!isSystemToast &&!areNotificationsEnabledForPackageInt(pkg)) {

Slog.e(TAG, "Suppressing toast from package " + pkg + " by user request.")

return

}

synchronized (mToastQueue) {

int callingPid = Binder.getCallingPid()

long callingId = Binder.clearCallingIdentity()

try {

ToastRecord record

int index = indexOfToastLocked(pkg, callback)

// If it's already in the queue, we update it in place, we don't

// move it to the end of the queue.

if (index >= 0) {

record = mToastQueue.get(index)

record.update(duration)

} else {

// Limit the number of toasts that any given package except the android

// package can enqueue. Prevents DOS attacks and deals with leaks.

if (!isSystemToast) {

int count = 0

final int N = mToastQueue.size()

for (int i=0i<Ni++) {

final ToastRecord r = mToastQueue.get(i)

if (r.pkg.equals(pkg)) {

count++

if (count >= MAX_PACKAGE_NOTIFICATIONS) {

Slog.e(TAG, "Package has already posted " + count

+ " toasts. Not showing more. Package=" + pkg)

return

}

}

}

}

record = new ToastRecord(callingPid, pkg, callback, duration)

mToastQueue.add(record)

index = mToastQueue.size() - 1

keepProcessAliveLocked(callingPid)

}

// If it's at index 0, it's the current toast. It doesn't matter if it's

// new or just been updated. Call back and tell it to show itself.

// If the callback fails, this will remove it from the list, so don't

// assume that it's valid after this.

if (index == 0) {

showNextToastLocked()

}

} finally {

Binder.restoreCallingIdentity(callingId)

}

}

}

有点看不懂了。。。。。。。 其中的内嵌在Toast中的TN类可能实现了toast的显示 他其中有一些方法

[java] view plain copy print?

/**

* schedule handleShow into the right thread

*/

public void show() {

if (localLOGV) Log.v(TAG, "SHOW: " + this)

mHandler.post(mShow)

}

/**

* schedule handleHide into the right thread

*/

public void hide() {

if (localLOGV) Log.v(TAG, "HIDE: " + this)

mHandler.post(mHide)

}

可能控制Toast的显示我们可以试试

由于TN类是private的所以我们只能使用反射机制来做了

我们不能获得但是Toast类中有这个对象我们可以使用

[java] view plain copy print?

Field field = toast.getClass().getDeclaredField("mTN")

field.setAccessible(true)

Object obj = field.get(toast)

Method method = obj.getClass().getDeclaredMethod("show", null)

method1=obj.getClass().getDeclaredMethod("hide", null)

method.invoke(obj, null)

这样就使Toast一直显示了

要清除Toast的话只需要反射获得hide方法然后执行就可以了

WeUI

WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一。包含button、cell、dialog、 progress, toast、article、icon等各式元素。

Frozen UI

Frozen UI是腾讯社交用户体验设计 - 增值UI开发团队一个开源的简单易用,轻量快捷的移动端UI框架。基于手Q样式规范,选取最常用的组件,

做成手Q公用离线包减少请求,升级方式友好,文档完善,目前全面应用在腾讯手Q增值业务中。

FrozenUI提供的CSS组件是目前QQ会员前端开发组所用的通用样式库。遵循手Q样式规范,基本样式使用离线包的方式减少请求,并提供快速接入的方案。

FrozenUI提供的一系列JavaScript插件,更优雅地在移动端上呈现更灵动的动画效果。

FrozenJS 是针对移动端开发的 js 组件库,其依赖 zepto.js 和 FronzenUI。

FrozenJS 的所有组件均以 zepto 的插件的形式存在。

阿里开源的SUI Mobile

SUI Mobile

SUI Mobile 是一套基于 Framework7 开发的UI库。并参考 Ratchet、Fastclick 开源库。它非常轻量、精美,只需要引入我们的CDN文件就可以使用,并且能兼容到 iOS 6.0+ 和 Android 4.0+,非常适合开发跨平台Web App。

轻量的UI库 SUI Mobile 非常轻量,核心库压缩Gzip后的JS、CSS网络传输体积总共只有52K,却提供了20+个常用的组件。

对于只有HTML&CSS的组件,你只需要复制HTML代码既可以使用。他的大部分JS组件都是独立的 Zepto 插件,并且提供了Zepto/jQuery 风格的API,你将会非常熟悉这种方式。

开发团队:阿里巴巴共享业务事业部UED团队

百度系

GMU

GMU是基于zepto的mobile UI组件库,提供webapp、pad端简单易用的UI组件!

Jingle

Jingle是一个SPA(Single Page Application)开发框架,用来开发移动端的html5应用,在体验上尽量去靠近native应用,希望有一天html5能够做到与native一样的操作体验。

丰富的UI组件提供了按钮、列表、表单、弹出框、轮换、上拉/下拉、日历等各种移动端常用的组件,简单适用,

前后端分离支持前端模板渲染,模板按需自动加载,完善的事件机制。

轻量级基于Zepto开发,依赖了iscrol

purecss

purecss采用其Grid的部分即可,需要定制的部分,建议自行配置,或者是直接采用grid.css,grid960.css这样的栅格来处理。Purecss小的没有节操,全部模块gzip压缩后才 4.4KB* 。 考虑到移动端,保持文件尽量小对我们来说非常重要,每一行CSS都经过深思。如果你只用部分模块,简直小的忽略。

Pure基石,Pure基于Normalize.css添加了HTML元素的布局和样式,以及常用的UI组件。全是精华,木有糟粕。

移动端是初衷,Pure是响应式的盒子模型,适应所有尺寸的屏幕。通过皮肤生成器可以自定义样式。

写出你自己的样式,Pure提供最基础的样式,鼓励你基于此写出自己的样式。它被设计为容易覆写,且不影响你自己的样式。

ionic

基于angular2,丰富的UI组件,大大改进的编程模型,非常适合快速开发。

jquery mobile

jQuery Mobile 是创建移动 web 应用程序的框架。

jQuery Mobile 适用于所有流行的智能手机和平板电脑。

jQuery Mobile 使用 HTML5 和 CSS3 通过尽可能少的脚本对页面进行布局。

Bootstrap

Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。

wex5

国产的ui,支持打包。

前端UI:完全恪守html5+css3+js,干净纯洁设备api:采用业界主流Phonegap/Cordova

向导、模板:简单定义,即可轻松制作向导和模板

主题、样式:海量bootstrap资源引入和定制

UI组件:纯H5+CSS3,轻松引入第三方UI组件

插件:轻松对接即时通讯、推送、支付等各类插件

后端:轻松调用后端组件和api,并实现可视化