androidtoastandroid toast可不可以弹出变量值?
androidtoast 时间:2021-06-23 阅读:(
)
android的toast怎么自定义显示时间长度?
Android中Toast的显示时间为特定时间且不可更改,但是有时候我们开发设计需要让Toast显示更长时间,或者自己完全控制Toast的显示和关闭。
通过查看Toast类的源码,可以看出,这有点难为它了,Toast类本身并没有提供相应方法。
但是通过源码的查看,还是可以看出点眉头。
源码分析思路在这里转eoe里的一篇文章,思路较为清晰:
转:
Toast信息提示框之所以在显示一定时间后会自动关闭,是因为在系统中有一个Toast队列。
系统会依次从队列中取(出队列)一个Toast,并 显示它。
在显示一段时间后,再关闭,然后再显示下一个Toast信息提示框。
直到Toast队列中所有Toast都显示完为止。
那么有些时候需要这个Toas t信息提示框长时间显示,直到需要关闭它时通过代码来控制,而不是让系统自动来关闭Toast信息提示框。
不过这个要求对于Toast本身来说有些过 分,因为Toast类并没有提供这个功能。
虽然如此,但方法总比问题多。
通过一些特殊的处理还是可以实现这个功能的,而且并不复杂。
Toast信息提示框需要调用Toast.show方法来显示。
下面来看一下show方法的源代码。
public void show() {
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
}
INotificationManager service = getService();
String pkg = mContext.getPackageName();
TN tn = mTN;
try {
// 将当前Toast加入到Toast队列
service.enqueueToast(pkg, tn, mDuration);
} catch (RemoteException e) {
// Empty
}
}
复制代码
show方法的代码并不复杂,可以很容易找到如下的代码。
service.enqueueToast(pkg, tn, mDuration);
复制代码
从上面的代码可以很容易推断出它的功能是将当前的Toast加入到系统的Toast队列中。
看到这里,各位读者应该想到。
虽然show方法的表面功能是显示Toast信息提示框,但其实际的功能是将Toast加入到队列中,再由系统根据Toast队列来显示Toast信息提示框。
那么我们经过更进一步地思考,可以大胆地做出一个初步的方案。
既然系统的Toast队列可以显示Toast信息提示框,那么我们为什么不可以自己来显示它呢?
这样不是可以自己来控制Toast的信息提示框的显示和关闭了吗!当然,这就不能再调用show方法来显示Toast信息提示框了(因为show方法会将Toast加入队列,这样我们就控制不了Toast了)。
既然初步方案已拟定,现在就来实施它。
先在Toast类找一下还有没有其他的show方法。
结果发现了一个TN类,该类是Toast的一个内嵌类。
在TN类中有一个show方法。
TN是ITransientNotification.Stub的子类。
从ITransientNotification和TN类中的show方法初步推断(因为Transient的中文意思是“短暂的”)系统是从Toast队列中获得了Toast对象后,利用TN对象的show方法显示Toast,再利用TN.hide方法来关闭Toast。
首先声明,这只是假设,我们还不知道这么做是否可行!当然,这也是科学研究的一般方法,先推断或假设,然后再证明推断或假设。
现在关键的一步是获得TN对象。
遗憾的是TN被声明成private类型,外部无法访问。
不过别着急。
在Toast类中有一个mTN变量。
虽然不是public变量,但仍然可以通过反射技术访问该变量。
mTN变量会在创建Toast对象时初始化。
因此,只要获得mTN变量,就获得了TN对象。
下面的代码显示了一个永远不会自动关闭的Toast信息提示框。
// 先创建一个Toast对象 Toast toast = Toast.makeText(this, "永不消失的Toast", Toast.LENGTH_SHORT); // 设置Toast信息提示框显示的位置(在屏幕顶部水平居中显示) toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0); try {
// 从Toast对象中获得mTN变量 Field field = toast.getClass().getDeclaredField("mTN");
essible(true);
Object obj = field.get(toast);
// TN对象中获得了show方法
Method method = obj.getClass().getDeclaredMethod("show", null);
// 调用show方法来显示Toast信息提示框
method.invoke(obj, null);
}
catch (Exception e)
{
}
复制代码
上面的代码中try{…}catch(…){…}语句中的代码是关键。
先利用事先创建好的Toast对象获得了mTN变量。
然后再利用反射技术获得了TN对象的show方法。
关闭Toast和显示Toast的方法类似,只是需要获得hide方法,代码如下:
try
{
// 需要将前面代码中的obj变量变成类变量。
这样在多个地方就都可以访问了
Method method = obj.getClass().getDeclaredMethod("hide", null);
method.invoke(obj, null);
}
catch (Exception e)
{
}
复制代码
上面的代码已经很完美地实现了通过代码控制Toast信息提示框显示和关闭的功能。
但如果想实现得更完美,可以在Android SDK源代码中找一个叫ITransientNotification.aidl的文件(该文件是AIDL服务定义文件,将在后面详细介绍),并在Android工程的src目录中建一个android.app包,将这个文件放到这个包中。
然后ADT会自动在gen目录中生成了一个android.app包,包中有一个ITransientNotification.java文件。
由于Android SDK自带的ItransientNotification接口属于内部资源,外部程序无法访问,因此,只能将从Toast对象中获得的mTN变量转换成刚才生成的ITransientNotification对象了。
这样就不需要使反射技术获得show和hide方法了。
经过改良的显示和关闭Toast信息提示框的代码如下:
ITransientNotification notification = (ITransientNotification) field.get(toast);
// 显示Toast信息提示框
notification.show();
// 关闭Toast信息提示框
notification.hide();
复制代码
最后整理代码如下:
Java代码
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class TestToastActivity extends Activity {
private Button showtoast,closetoast;
private Toast toast;
private Field field;
private Object obj;
private Method showMethod,hideMethod;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化按钮组件
showtoast = (Button)this.findViewById(R.id.showtoast);
closetoast = (Button)this.findViewById(R.id.closetoast);
//设置组件监听
showtoast.setOnClickListener(new MyOnClickListener());
closetoast.setOnClickListener(new MyOnClickListener());
//创建Toast对象
toast = Toast.makeText(this, "Toast自定义显示时间测试", 1);
toast.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL, 0, 0);
//利用反射技术拿到mTN对象
reflectionTN();
}
class MyOnClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.showtoast:
try {
showMethod.invoke(obj, null);//调用TN对象的show()方法,显示toast
} catch (Exception e) {
e.printStackTrace();
}
break;
case R.id.closetoast:
try {
hideMethod.invoke(obj, null);//调用TN对象的hide()方法,关闭toast
} catch (Exception e) {
e.printStackTrace();
}
break;
default:
break;
}
}
}
private void reflectionTN() {
try {
field = toast.getClass().getDeclaredField("mTN");
essible(true);
obj = field.get(toast);
showMethod = obj.getClass().getDeclaredMethod("show", null);
hideMethod = obj.getClass().getDeclaredMethod("hide", null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码Android中Toast的几种使用方法
我现在的设置是居中靠顶???????????????? //第二个参数:相对于第一个参数设置toast位置的横向X轴的偏移量,正数向右偏移,负数向左偏移???????????????? //第三个参数:同的第二个参数道理一样???????????????? //如果你设置的偏移量超过了屏幕的范围,toast将在屏幕内靠近超出的那个边界显示???????????????? toast.setGravity(Gravity.TOP|Gravity.CENTER, -50, 100);?????????????????? //屏幕居中显示,X轴和Y轴偏移量都是0???????????????? //toast.setGravity(Gravity.CENTER, 0, 0); ???????????????? toast.show();????3.带图片的Java代码Toast toast=Toast.makeText(getApplicationContext(), “显示带图片的toast”, 3000);???????????????? toast.setGravity(Gravity.CENTER, 0, 0);?????????????????? //创建图片视图对象???????????????? ImageView imageView= new ImageView(getApplicationContext());???????????????? //设置图片???????????????? imageView.setImageResource(R.drawable.ic_launcher);???????????????? //获得toast的布局???????????????? LinearLayout toastView = (LinearLayout) toast.getView();???????????????? //设置此布局为横向的???????????????? toastView.setOrientation(LinearLayout.HORIZONTAL);???????????????? //将ImageView在加入到此布局中的第一个位置???????????????? toastView.addView(imageView, 0);???????????????? toast.show();????4.完全自定义显示方式Java代码//Inflater意思是充气?????????????? //LayoutInflater这个类用来实例化XML文件到其相应的视图对象的布局?????????????? LayoutInflater inflater = getLayoutInflater();?????????????? //通过制定XML文件及布局ID来填充一个视图对象?????????????? View layout = inflater.inflate(R.layout.custom2,(ViewGroup)findViewById(R.id.llToast));?????????????????????????????? ImageView image = (ImageView) layout.findViewById(ImageToast);?????????????? //设置布局中图片视图中图片?????????????? image.setImageResource(R.drawable.ic_launcher);?????????????????????????????? TextView title = (TextView) layout.findViewById(TitleToast);?????????????? //设置标题?????????????? title.setText(“标题栏”);?????????????????????????????? TextView text = (TextView) layout.findViewById(TextToast);?????????????? //设置内容?????????????? text.setText(“完全自定义Toast”);?????????????????????????????? Toast toast= new Toast(getApplicationContext());?????????????? toast.setGravity(Gravity.CENTER , 0, 0);?????????????? toast.setDuration(Toast.LENGTH_LONG);?????????????? toast.setView(layout);?????????????? toast.show();????5.其他线程通过Handler的调用Java代码//调用方法1???????? //Thread th=new Thread(this);???????? //th.start();???????? //调用方法2???????? handler.post(new Runnable() {???????????????? @Override???????????????? public void run() {???????????????????????? showToast();???????????????? }???????? });????Java代码public void showToast(){???????????????? Toast toast=Toast.makeText(getApplicationContext(), “Toast在其他线程中调用显示”, Toast.LENGTH_SHORT);???????????????? toast.show();???????? }????Java代码Handler handler=new Handler(){???????????????? @Override???????????????? public void handleMessage(Message msg) {???????????????????????? int what=msg.what;???????????????????????? switch (what) {???????????????????????? case 1:???????????????????????????????? showToast();???????????????????????????????? break;???????????????????????? default:???????????????????????????????? break;???????????????????????? }?????????????????????????????????????????????????? super.handleMessage(msg);???????????????? }???????? };????Java代码@Override???????? public void run() {???????????????? handler.sendEmptyMessage(1);???????? }??如何解决android Toast重复显示
public class ToastUtils {
private static Toast mToast;
/**
* 显示Toast
*/
public static void showToast(Context context, CharSequence text, int duration) {
if(mToast == null) {
mToast = Toast.makeText(context, text, duration);
} else {
mToast.setText(text);
mToast.setDuration(duration);
}
mToast.show();
}
}
单例显示,一直刷新同一个Toastandroid toast可不可以弹出变量值?
Toast.makeText(getApplicationContext(), 变量值, Toast.LENGTH_SHORT).show();
将变量值该成你所想要弹出的变量即可!
DogYun怎么样?DogYun是一家2019年成立的国人主机商,称为狗云,提供VPS及独立服务器租用,其中VPS分为经典云和动态云(支持小时计费及随时可删除),DogYun云服务器基于Kernel-based Virtual Machine(Kvm)硬件的完全虚拟化架构,您可以在弹性云中,随时调整CPU,内存,硬盘,网络,IPv4路线(如果该数据中心接入了多条路线)等。DogYun弹性云服务器优...
艾云怎么样?艾云是一家去年年底成立的国人主机商家,商家主要销售基于KVM虚拟架构的VPS服务,机房目前有美国洛杉矶、圣何塞和英国伦敦,目前商家推出了一些年付特价套餐,性价比非常高,洛杉矶套餐低至85元每年,给500M带宽,可解奈飞,另外圣何塞也有特价机器;1核/1G/20G SSD/3T/2.5Gbps,有需要的朋友以入手。点击进入:艾云官方网站艾云vps促销套餐:KVM虚拟架构,自带20G的防御...
商家介绍:星梦云怎么样,星梦云好不好,资质齐全,IDC/ISP均有,从星梦云这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,星梦云专注四川高防服务器,成都服务器,雅安服务器,。活动优惠促销:1、成都电信夏日激情大宽带活动机(封锁UDP,不可解封):机房CPU内存硬盘带宽IP防护流量原价活动价开通方式成都电信优化线路2vCPU2G40G+60G21...
androidtoast为你推荐
windowsmediawindows media player打开怎么设置averagesPoisson-Arrivals-See-Time-Averages是什么意思方正证券官方网方正证券同花顺下载/2010同花顺官方网站/同花顺官方网站首页网站客服代码如何将在线客服代码插入到您的网页中?医院排队系统医院排队叫号系统有哪些功能?微盟价格虚拟币的价格由什么决定西安娱乐西安那里有好玩的地方,夜生活不去在线操作系统什么是网络操作系统,与普通操作系统有什么区别windows7中文语言包windows7英文改中文 windows英文版怎么安装中文语言包邮政网关如何注销中国邮政支付网关网上账号
查询ip地址 中文域名申请 免费申请域名 3322动态域名 域名抢注工具 踢楼 locvps 樊云 主机 cve-2014-6271 国外idc 特价空间 hnyd 浙江独立 e蜗牛 空间出租 北京双线机房 万网空间购买 吉林铁通 江苏双线服务器 更多