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();
将变量值该成你所想要弹出的变量即可!
Hosteons,一家海外主机商成立于2018年,在之前还没有介绍和接触这个主机商,今天是有在LEB上看到有官方发送的活动主要是针对LEB的用户提供的洛杉矶、达拉斯和纽约三个机房的方案,最低年付21美元,其特点主要在于可以从1G带宽升级至10G,而且是免费的,是不是很吸引人?本来这次活动是仅仅在LEB留言提交账单ID才可以,这个感觉有点麻烦。不过看到老龚同学有拿到识别优惠码,于是就一并来分享给有需...
百纵科技湖南百纵科技有限公司是一家具有ISP ICP 电信增值许可证的正规公司,多年不断转型探索现已颇具规模,公司成立于2009年 通过多年经营积累目前已独具一格,公司主要经营香港服务器,香港站群服务器,美国高防服务器,美国站群服务器,云服务器,母机租用托管!美国CN2云服务器,美国VPS,美国高防云主机,美国独立服务器,美国站群服务器,美国母机。美国原生IP支持大批量订货 合作 适用电商 亚马逊...
提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...
androidtoast为你推荐
instagram电脑版iOS 有哪些优秀的照片处理软件暴力破解rar求暴力破解rar压缩包软件webservice框架什么是webservice,什么情况下使用,如何使用broadcast播播……拼音上行宽带上行宽带是什么?shoujiao手机板aoblox怎么从英文变成中文腾讯合作伙伴大会腾讯位置服务是什么?东兴证券网站东兴证券交易软件如何操作?flash序列号Flash软件 的序列号是什么?particular教程AE的particular的particle设置
传奇服务器租用 深圳域名空间 便宜vps 老左 hkbn 42u机柜尺寸 外国空间 英语简历模板word 国外php空间 gspeed 工信部icp备案号 怎么建立邮箱 lamp的音标 北京主机托管 rewritecond alertpay rewrite规则 大容量存储控制器驱动 关闭空间申请 文件服务器硬件配置 更多