編輯:關於Android編程
在測試自動化的過程中,有時經常需要獲取Toast的String來作檢驗。
在robotium中,我們知道可以通過solo.getView("message")方法獲取Toast的TextView,然後得到其String值,那麼其內部是怎麼實現的呢。
首先看下我們一般是怎麼調用Toast的:
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();當應用中調用Toast的makeText()方法時,系統做了如下事情:
public static Toast makeText(Context context, CharSequence text, int duration) {
Toast result = new Toast(context);
LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);
result.mNextView = v;
result.mDuration = duration;
return result;
}
由上可知,調用makeText時,系統初始化了個TextView,且這個TextView的id系統的id,為:com.android.internal.R.id.message
/**
* Returns a {@code View} with a given id.
*
* @param id the id of the {@link View} to return
* @param index the index of the {@link View}. {@code 0} if only one is available
* @return a {@code View} with a given id
*/
public View getView(String id, int index){
View viewToReturn = null;
Context targetContext = instrumentation.getTargetContext();
String packageName = targetContext.getPackageName();
int viewId = targetContext.getResources().getIdentifier(id, "id", packageName);
if(viewId != 0){
viewToReturn = getView(viewId, index, TIMEOUT);
}
if(viewToReturn == null){
int androidViewId = targetContext.getResources().getIdentifier(id, "id", "android");
if(androidViewId != 0){
viewToReturn = getView(androidViewId, index, TIMEOUT);
}
}
if(viewToReturn != null){
return viewToReturn;
}
return getView(viewId, index);
}
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,我們可以自己再封裝一下:
/**
* 獲取Toast的String值
* @return
*/
public String getToast(int timeout){
TextView toastTextView = null;
String toastText = "";
long endTime = SystemClock.uptimeMillis() + timeout;
while(SystemClock.uptimeMillis() < endTime){
toastTextView = (TextView) getView("message", 0);
if(null != toastTextView){
toastText = toastTextView.getText().toString();
break;
}else {
sleeper.sleepMini();
}
}
return toastText;
}
好吧,天冷又水了一篇。。
XML解析器
一、操作XML文檔概述1、如何操作XML文檔XML文檔也是數據的一種,對數據的操作也不外乎是“增刪改查”。也被大家稱之為“CRUD&r
android Binder講解
Binder用於完成進程間通信(IPC),即把多個進程“別”在一起,從線程的角度來講,Binder驅動代碼運行在內核態,客戶端程序調用Binder是通過系統調用完成的。B
如何簡單實現安卓app自動更新功能
一般的安卓app都有自動更新功能,實現app的更新,以讓用戶體驗新版本的功能,這裡也是項目中用到的,今天就來總結一下,代碼應該有點多,還請耐心點哈。安卓應用實現自動更新比
360面試總結(Android)
閒談:從大二暑假的時候開始,一直想進騰訊或者阿裡,在招實習生的時候,最終遺憾落選。暑假的時候為了好好准備校招,我放棄了去步步高實習的機會,繼續在原來的一家公司實習。在暑假