问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

怎么实现toast中的hide方法

发布网友 发布时间:2022-04-26 16:10

我来回答

2个回答

热心网友 时间:2022-04-26 23:26

在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 ration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, msg, ration);
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 ration.
*/
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 ration);
void cancelToast(String pkg, ITransientNotification callback);
}

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

[java] view plain copy print?
public void enqueueToast(String pkg, ITransientNotification callback, int ration)
{
if (DBG) Slog.i(TAG, "enqueueToast pkg=" + pkg + " callback=" + callback + " ration=" + ration);

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(ration);
} 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=0; i<N; i++) {
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, ration);
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?
/**
* schele handleShow into the right thread
*/
public void show() {
if (localLOGV) Log.v(TAG, "SHOW: " + this);
mHandler.post(mShow);
}

/**
* schele 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方法然后执行就可以了

热心网友 时间:2022-04-27 00:44

通过调整对象的CSS样式来实现,简单显示和隐藏可以直接设置display属性。 function hide(objid){ document.getElementById(objid).style.display="none";}function show(objid){ document.getElementById(objid).style.display="block";}如果要...
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
2款摄像头录像软件,满足你的多种要求! 请问你用的摄像头录像是什么软件,能给我一份么? 哪些科学小实验能激发孩子的好奇心? 电费预存金额什么意思 预存电费和银行代扣 怎么样在淘宝网网上买彩票 现在淘宝上还能买彩票吗? 仙剑奇侠传5前传的爱情关系是这样的啊 仙剑5前传人物结局玩家评价介绍_仙剑5前传人物结局玩家评价是什么_百 ... 《念奴娇,赤壁怀古》中赤壁之战的英雄很多,作者为什么... 广州华多在科技创新上做了哪些工作? 苹果手机怎么关闭卸载未使用的应用 谁和我一样喜欢魔术啊,哪里能下魔术的手机视频 苹果手机上卸载未使用的软件怎么设置 MSHOW为什么安装不上?问题如图最主要的是怎么解决?电脑W7系统,也下载装上了dx11显卡 Mshowbuy是干啥的? mshow云导播为什么不支持xp 创维电视43寸哪个型号好 mshow怎么读 43寸液晶电视什么牌子好? 怎么用mshow云导播直播手机游戏 43寸电视买松下好还是LG好? mshow云导播怎么投屏手机游戏 43寸电视什么型号的最好海信牌的 想换一个43寸的电视,之前了解了一下乐视的和小米的。哪个好些啊? 家里看习惯43英寸电视了,有好的产品推荐么? 什么播放器看什么视频都不要vip 有没有一款不受vip限制的视频播放器? iphone设置指纹密码忘了怎么办 iPhone 6怎么设置QQ指纹登陆和指纹解锁? 重庆哪里有照大头贴的? 小米手机无法使用WindowManager的addView,怎么解决 Mshow怎么分享到QQ空间 mshow英文怎么读 黑执事舞台剧演格雷尔的是谁 sci论文怎么翻译? sci论文如何翻译?!!求告诉呀 想问下毕业论文能不能把中文用谷歌翻译成英语,再 怎样用电脑在网上把文章英语翻译成中文? 论文如何很好的翻译成英文呢? 用goole直接翻译sci论文怎么样?? 希捷超薄硬盘盒Seven评测怎么样 求论文英语翻译网站! 股票开户可以用手机直接开吗 澳大利亚有一个legend,是phar lap,谁能帮我把phar lap的生平事迹的timetable写出来啊??? 谷歌浏览器语言是中文的, 但是谷歌翻译打开全都是日语.怎么把谷歌翻译变成汉语啊? 急急急 win7和vista的驱动能通用吗? 论文摘要翻译为什么不能用Google翻译?学校会查吗? 讯闪2008要求 手机qq个性名片照片墙的赞怎么取消
  • 焦点

最新推荐

猜你喜欢

热门推荐