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(); } } 单例显示,一直刷新同一个Toast

android toast可不可以弹出变量值?

Toast.makeText(getApplicationContext(), 变量值, Toast.LENGTH_SHORT).show(); 将变量值该成你所想要弹出的变量即可!

Megalayer(月599元)限时8月香港和美国大带宽服务器

第一、香港服务器机房这里我们可以看到有提供四个大带宽方案,是全向带宽和国际带宽,前者适合除了中国大陆地区的全网地区用户可以用,后者国际带宽适合欧美地区业务。如果我们是需要大陆地区速度CN2优化的,那就需要选择常规的优化带宽方案,参考这里。CPU内存硬盘带宽流量价格选择E3-12308GB240GB SSD50M全向带宽不限999元/月方案选择E3-12308GB240GB SSD100M国际带宽不...

随风云-内蒙古三线BGP 2-2 5M 25/月 ,香港CN2 25/月 ,美国CERA 25/月 所有云服务器均支持5天无理由退款

公司成立于2021年,专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、三线高防、香港等优质的IDC资源。公司一直秉承”以人为本、客户为尊、永续创新”的价值观,坚持”以微笑收获友善, 以尊重收获理解,以责任收获支持,以谦卑收获成长”的行为观向客户提供全面优质的互...

美国多IP站群VPS商家选择考虑因素和可选商家推荐

如今我们很多朋友做网站都比较多的采用站群模式,但是用站群模式我们很多人都知道要拆分到不同IP段。比如我们会选择不同的服务商,不同的机房,至少和我们每个服务器的IP地址差异化。于是,我们很多朋友会选择美国多IP站群VPS商家的产品。美国站群VPS主机商和我们普通的云服务器、VPS还是有区别的,比如站群服务器的IP分布情况,配置技术难度,以及我们成本是比普通的高,商家选择要靠谱的。我们在选择美国多IP...

androidtoast为你推荐
无处不在的意思,幸福无处不在,最适合才是最好是什么意思云输入法QQ云输入法的候选窗口是什么样的?东兴证券网站东兴证券交易软件如何操作?怎么查微信注册时间怎么查一个微信公众号的注册时间,发了多少条内容particular教程AE的particular的particle设置微盟价格为什么这么多人用微盟,微盟都有哪些优势driversbackup我的电脑d盘里有个Backup文件夹 怎么能让他显示出来ibooks支持什么格式ibooks使用的最佳格式是什么格式?ps5教程PS5安装教程? 更改hosts那一步具体怎么做?卡发短信为什么我的手机卡不能发短信
万网域名注册 二级域名查询 广州主机租用 万网域名空间 域名服务器的作用 mach 表单样式 512au bgp双线 789电视网 nerds cdn加速原理 东莞服务器 新睿云 php服务器 畅行云 lamp架构 阿里云手机官网 工信部icp备案查询 godaddy空间 更多