Android获取Toast的String解析

本文详细解析了如何在Robotium中通过字符串ID获取Toast组件的TextView,并将其转换为String。同时,提供了一个封装方法用于在实际项目中更便捷地获取Toast内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在测试自动化的过程中,有时经常需要获取Toast的String来作检验。

在robotium中,我们知道可以通过solo.getView("message")方法获取Toast的TextView,然后得到其String值,那么其内部是怎么实现的呢。

首先看下我们一般是怎么调用Toast的:

  1. Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();     
当应用中调用Toast的makeText()方法时,系统做了如下事情:
  1. public static Toast makeText(Context context, CharSequence text, int duration) {  
  2.     Toast result = new Toast(context);  
  3.   
  4.     LayoutInflater inflate = (LayoutInflater)  
  5.             context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  6.     View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);  
  7.     TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);  
  8.     tv.setText(text);  
  9.       
  10.     result.mNextView = v;  
  11.     result.mDuration = duration;  
  12.   
  13.     return result;  
  14. }  
        由上可知,调用makeText时,系统初始化了个TextView,且这个TextView的id系统的id,为:com.android.internal.R.id.message
知道了Toast的本质是一个TextView,且其id是com.android.internal.R.id.message后,要获取它的String就好办了。
看robotium中的getView()方法的实现:
  1. /** 
  2.  * Returns a {@code View} with a given id. 
  3.  *  
  4.  * @param id the id of the {@link View} to return 
  5.  * @param index the index of the {@link View}. {@code 0} if only one is available 
  6.  * @return a {@code View} with a given id 
  7.  */  
  8.   
  9. public View getView(String id, int index){  
  10.     View viewToReturn = null;  
  11.     Context targetContext = instrumentation.getTargetContext();   
  12.     String packageName = targetContext.getPackageName();   
  13.     int viewId = targetContext.getResources().getIdentifier(id, "id", packageName);  
  14.   
  15.     if(viewId != 0){  
  16.         viewToReturn = getView(viewId, index, TIMEOUT);   
  17.     }  
  18.       
  19.     if(viewToReturn == null){  
  20.         int androidViewId = targetContext.getResources().getIdentifier(id, "id""android");  
  21.         if(androidViewId != 0){  
  22.             viewToReturn = getView(androidViewId, index, TIMEOUT);  
  23.         }  
  24.     }  
  25.   
  26.     if(viewToReturn != null){  
  27.         return viewToReturn;  
  28.     }  
  29.     return getView(viewId, index);   
  30. }  

        robotium为了方便以String形式的id来查找控件,因此封装了个如上getView(String id, int index)通过String id来获取View的方法,在这个方法中通过getIdentifier把String形式的id转变成int型的id,然后再根据Int型的id来查找控件,由上文我们已经知道Toast的id了,因此我们可以简单地通过solo.getView("message")来获取Toast的TextView。

当然了,为了实际项目中能更好地获取Toast,我们可以自己再封装一下:

  1. /** 
  2.  * 获取Toast的String值 
  3.  * @return 
  4.  */  
  5. public String getToast(int timeout){  
  6.     TextView toastTextView = null;  
  7.     String toastText = "";  
  8.     long endTime = SystemClock.uptimeMillis() + timeout;  
  9.     while(SystemClock.uptimeMillis() < endTime){  
  10.         toastTextView = (TextView) getView("message"0);  
  11.         if(null != toastTextView){  
  12.             toastText = toastTextView.getText().toString();  
  13.             break;  
  14.         }else {  
  15.             sleeper.sleepMini();  
  16.         }  
  17.     }  
  18.       
  19.     return toastText;         
  20. }  
好吧,天冷又水了一篇。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值