当前位置:首页 » 编程语言 » javatoast

javatoast

发布时间: 2023-04-01 03:27:22

java 怎么获得文字的坐标

如果解决了问题请将此答案设置为采纳,关注,如果有疑问请留言。
建议:
以后如果你在探寻一个对象里出现类似undefine的情况,很明显这是a.x不存在,如果是a不存在,那你代码就挂掉了
解决方法皮乎:将对象打印大宏出来,看看内部的属性有哪些滚握册,怎么获取,大家可能会说打印一个对象不能直接看到内容而是类似[Object.....]的东东,我们可以将object转化成JSON啊,然后打印查看对象内容。根据打印内容,确定如何获取坐标
总结:以上的问题,其实就是我们对数据对象内部结构不了解,要么查资料,要么直接自己探究(将对象内容全部打印)。

㈡ java:import android.widget.Toast; 这个是什麽包啊有什麽用啊急急急,请高手指点,谢啦!

这是Android SDK中android.jar中的一个类. 作用缺芦或是哗雀在界面上弹出伏伍一个悬浮提示框, 一段时间之后会自动消失.

㈢ Toast 提示报空指针是什么原因

原因:
之所以报空指针异常的原因是Button findViewById的时候指向了另一个界面的Button,当前界面的Button并没有被初始化,所以报了歼李空指针异常。
衫塌解决方法:
只要把这两或改圆个界面的Button设置为不相同的即可(或者给相应xml界面中的Button设置好Id)。

㈣ 第三方工具隐藏Toast弹出

1.集成环信实现聊天室功能时,每当有用户进入和离开聊天室总会弹出Toast,怎么隐藏掉呢?
在环信的Demo包里,找到xxxHXSDKHelper.java文件,在里面把监听回调的Toast注释掉即可。
或者使用Find in Path-》输入member,姿局找到环信下的所有Toast,注释掉。

2.在使用友盟进行社会化分享时,总会弹出“开始分享...”、“分享中...”、“分享成功...”这样的Toast,如果要注释掉,可以在迹好让加mController.getConfig().closeToast();

“微信提示:大于袜搜32k 压缩图片”时,加UMWXHandler.showCompressToast(false);即可。

㈤ 使用系统Toast的问题

记录下在使用系统Toast存在的问题:

1. 当通知洞州乱权限被关闭时华为等手机Toast不显示;
2. Toast队列机制上在不同手机上可能不同;
3. Toast的BadTokenException问题;

当发现系统Toast存在问题时,不少同学使用自定义纳档TYPE_TOAST弹框来实现相同效果.虽然情况下效果都是OK的,但TYPE_TOAST依然会存在问题:

4. Android8.0之后的token null is not valid问题(实测部分机型问题);
5. Android7.1之后,不允许同时展示两个TYPE_TOAST弹窗(实测部分机型问题);

那么解决方案是:

相信不少同学旧项目中封装的ToastUtil都是直接使用的ApplicationContext作为上下文,然后在需要弹窗的时候直接就是ToastUtil.show(str),这样的使用方式对于我们来说是最方便的啦。

当然,使用YToast你也依然可以沿用这种封装方式,但这种方式在下面这个场景中可能会无法成功展示出弹窗(该场景下原生Toast也一样无法弹出),不过请放心不会导致应用崩溃,而且这个场景出现的概率较小,有以下三个必要条件:

1.通知栏权限被关闭(通知栏权限默认都是打开的)
2.非MIUI手机
3.Android8.0以上的部分手机(我最近测试中的几部8.0+设备都不存在该问题)。

不过,如果想要保证在所有场景下都能正常展示弹窗,还是建议在YToast.make(context)时传入Activity作为上下文,这样在该场景下YToast会启用ActivityToast展示出弹窗。

接下来再详细分析下上面提到的五个问题。

看下方Toast源码中的show()方法,通过AIDL获迹纤取到INotificationManager,并将接下来的显示流程控制权交给NotificationManagerService。NMS中会对Toast进行权限校验,当通知权限校验不通过时,Toast将不做展示。

当然不同ROM中NMS可能会有不同,比如MIUI就对这部分内容进行了修改,所以小米手机关闭通知权限不会导致Toast不显示。

如何解决这个问题?只要能够绕过NotificationManagerService即可。

YToast通过使用TYPE_TOAST实现全局弹窗功能,不使用系统Toast,也没有使用NMS服务,因此不受通知权限限制。

我找了四台设备,创建两个Gravity不同的Toast并调用show()方法,结果出现了四种展示效果:

造成这个问题的原因应该是各大厂商ROM中NMS维护Toast队列的逻辑有差异。
同样的,YToast内部也维护着自己的队列逻辑,保证在所有手机上使用DToast的效果相同。

YToast中多个弹窗连续出现时:

相同优先级时,会终止上一个,直接展示后一个;
不同优先级时,如果后一个的优先级更高则会终止上一个,直接展示后一个。

什么情况下windowToken会失效?

UI线程发生阻塞,导致TN.show()没有及时执行,当NotificationManager的检测超时后便会删除WMS中的该token,即造成token失效。

如何解决?

因此对于8.0之前的我们也需要做相同的处理。YToast是通过反射完成这个动作,具体看下方实现:

Android8.0后对WindowManager做了限制和修改,特别是TYPE_TOAST类型的窗口,必须要传递一个token用于校验。
API25:(PhoneWindowManager.java源码)

API26:(PhoneWindowManager.java源码)

为了解决问题一,DovaToast不得不选择绕过NotificationManagerService的控制,但由于windowToken是NMS生成的,绕过NMS就无法获取到有效的windowToken,于是作为TYPE_TOAST的DovaToast就可能陷入第四个问题。

因此,DToast选择在DovaToast出现该问题时引入ActivityToast,在DovaToast无法正常展示时创建一个依附于Activity的弹窗展示出来,不过ActivityToast只会展示在当前Activity,不具有跨页面功能。

如果说有更好的方案,那肯定是去获取悬浮窗权限然后改用TYPE_PHONE等类型,但悬浮窗权限往往不容易获取,目前来看恐怕除了微信其他APP都不能保证拿得到用户的悬浮窗权限。

YToast的弹窗策略就是同一时间最多只展示一个弹窗,逻辑上就避免了此问题。因此仅捕获该异常。

其他建议

如果能够接受Toast不跨界面的话,建议使用SnackBar

㈥ 怎么实现toast中的hide方法

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

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

[java] view plain 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 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 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 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 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 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 && !(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 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 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方法然后执行就可以了

㈦ Android 的Thread编程,我在Thread的run()方法中用Toast输出信息时出错!

不能在子线程中更新UI,这是我之前写的一个例子,你看看,使用Handler消息机制

public class HandlerDemoActivity extends Activity implements OnClickListener {
Button btn1,btn2;
ProgressBar progressBar;
UpdateDataHandler updateDataHandler;
HandlerThread handlerThread;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
progressBar = (ProgressBar)findViewById(R.id.progressBar1);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);

}
/**
* 自定义一个类来继承Handler类,并重写handleMessage函数,
* 并且需要一个带有Looper对象的构造函数
* 循环检测是否有消息,如果有消息,将调用handleMessage取出数据,
* 如果没有消息,进入等待状态
* @author Administrator
*
*/
class UpdateDataHandler extends Handler{

public UpdateDataHandler(Looper looper){
super(looper);
}

@Override
public void handleMessage(Message msg) {

super.handleMessage(msg);

System.out.println("----------" + Thread.currentThread().getId());
progressBar.setProgress(msg.arg1); //从消息队列中取出数据,并更新控件
updateDataHandler.post(printRunnable);
}
}

Runnable printRunnable = new Runnable() {//实现一个线程类
int i = 0;
@Override
public void run() { //重写线程类中的run函数
i += 20;
Message msg = updateDataHandler.obtainMessage(); //获得handler的message对象
msg.arg1=i; //向message对象中放置数据
//msg.obj = obj;//还可以发送一些对象
//msg.setData();//可以发送Bundle对象
try {
Thread.sleep(1000); //暂停1秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
if(i > 100) //判断当变量到达100时,操作结束
{
updateDataHandler.removeCallbacks(printRunnable);//从handler中释放线程类
return;
}
//msg.sendToTarget(); //使用此函数也可以实现发送消息
updateDataHandler.sendMessage(msg); //将message对象放到消息队列中
}
};

@Override
public void onClick(View v) {
if(v == btn1)
{
handlerThread = new HandlerThread("");// HandlerThread是一个Thread,继承自Thread。它保留着对Looper实例的引用
handlerThread.start(); //一定要调用线程的start函数
updateDataHandler = new UpdateDataHandler(handlerThread.getLooper());
updateDataHandler.post(printRunnable);
System.out.println("主线程" + Thread.currentThread().getId());

}
}
}

㈧ android的runnable里可以写toast么

Android中提供一种简单的Toast消息提示框机制,可以在用户点击了某些按钮后,提示用户一些信息,提示的信息不能被用户点击,Toast的提示信息根据用户设置的显示时间后自动消失。Toast的提示信息可以在调试程序的时候方便的显示某些想显示的东西。 两种方法创建Toast 第一种方法的Java代码: makeText(Context context, int resId, int ration) 参数:context是toast显示在哪个上下文,通常是当前Activity;resId指显示内容引用Resouce那条数据,就是从R类中去指定显示的消息内容;ration指定显示时间,Toast默认有LENGTH_SHORT和LENGTH_LONG两常量,分别表示短时间显示和长时间显示。 第二种方法的Java代码: makeText(Context context, CharSequence text, int ration) 参数context和ration与第一个方法相同,参数text可以自己写消息内容。 用上面任意方法创建Toast对象之后调用方法show()即可显示。 Java代码: Toast toast = Toast.makeText(ToastDemoActivity.this, "这是一个普通的Toast!", Toast.LENGTH_SHORT); toast.show();

㈨ Android 中如何在java类中调用activity 中的一个方法

通常,您不应该以这种方式创建新的 MainActivity 实例。要打开一个新的 MainActivity,请使用 Intent。在您的情况下,您应该引用原始 MainActivity 实例,并在那里调用此方法。不要以任何方式创建新的,因为您已经在运行它。
一个简单的解决方法:
MainActivity.this.myMethod("Hello there")
您不必存储mContext. 你已经在 MainActivity 里面了。
因此,完整的代码将是:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView myWebView = findViewById(R.id.webview);
myWebView.loadUrl("http://www.google.com");
myWebView.addJavascriptInterface(new WebAppInterface(), "Android");
}
public void myMethod(String test){
Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
}
public class WebAppInterface {
/** Show a toast from the web page */

@JavascriptInterface
public void showToast(String toast) {
MainActivity.this.myMethod("Hello there");
}
}
}
实际上,我认为您甚至可以避免使用MainActivity.this., 并myMethod直接调用。

㈩ 用kotlin语法怎么写java代码中的吐司toast

kotlin中的写派带法搏和如下:
import mypackage.util.ContextExtensions.toast
fun myFun(context: Context) {
context.toast("Hello world!"基羡盯)
}

热点内容
python极客项目编程 发布:2024-11-02 16:38:49 浏览:245
mysql数据库名查看 发布:2024-11-02 16:37:38 浏览:702
怎么存储液氮 发布:2024-11-02 16:29:20 浏览:381
顺序存储文件 发布:2024-11-02 16:26:16 浏览:795
python266 发布:2024-11-02 16:22:06 浏览:364
计算机如何设置双密码 发布:2024-11-02 15:38:18 浏览:929
超高速存储 发布:2024-11-02 15:23:30 浏览:898
javades加密文件 发布:2024-11-02 15:14:15 浏览:534
读卡器怎么看配置 发布:2024-11-02 15:14:10 浏览:459
安卓手机如何更改屏幕常亮 发布:2024-11-02 15:14:02 浏览:605