<b>3.3 robotium實踐運用</b>
<b>3.3.1 控件id相同時擷取控件</b>
實際界面中常常有一些子控件是相同id甚至沒有id的,但這時候一般其父視圖是有id的。如圖3-14所示,每個tab的控件id是相同的。
圖3-14 擁有相同id的底部tab
因為界面中也很可能會出現多個發現、遊戲這樣的文本,是以也不能采取類似gettext(“發現”)這樣的方式。這裡,我們就可以通過id擷取唯一父控件,再通過過濾方式擷取指定的控件。
//先根據id獲得唯一的布局linearlayout
linearlayout
mtabs = (linearlayout)solo.getview("main_tabs");
//然後通過過濾方式擷取該linearlayout下的所有文本控件
arraylist<textview>
tabs = solo
.getcurrentviews(textview.class,mtabs);
如果子控件的id都是一樣的,而我們仍然希望通過id來定位控件,那麼應該如何擷取呢?我們知道不論是activity類還是view類都是可以通過findviewbyid(int id)方法直接在控件樹中根據id來查找控件的,是以當我們獲得一個父視圖後,就可以通過findviewbyid (int id)方法根據id來查找相應的子控件,這種方法可以普遍應用在listview中。
//先根據id獲得唯一的布局listview
listview
mlistview = (listview)solo.getview("example_list_id");
//先通過mlistview.getchildat(0)擷取該listview的第一個child,然後再通過該
//child在控件樹中使用findviewbyid根據id來擷取
textview
firstlisttitle = (textview) mlistview.getchildat(0).findviewbyid(getid
("example_title"));
這裡的重點是findviewbyid(int id)傳進去的是int型的id,而我們通過hierarchyviewer或uiautomatorviewer檢視到的id都是string型的,由前文的原理介紹可知,我們可以将string型的id轉換成int型的id,如代碼清單3-19所示:
代碼清單3-19 将string型的id轉換成int型的id
public int
getid(string id,string packagename){
context targetcontext =
instrumentation.gettargetcontext().getapplicationcontext();
int viewid =
targetcontext.getresources().getidentifier(id, "id", packagename);
logutils.logd("copyofassistanttabactivitytest",
"viewid:" + viewid);
if(viewid == 0){
viewid =
targetcontext.getresources().getidentifier(id, "id",
"android");
}
return viewid;
}
是以,當碰到同一層級控件id相同時,可以先尋找唯一的父布局,再通過父布局尋找子控件。如果子控件結構均相同,那麼可以通過index索引來查找;如果子控件結構不一緻,則可以通過周遊的方式找到指定的子控件。