我正在尝试验证应用的TextView
,该应用会在搜索类别时显示所列产品的price
。
我正在使用Robotium进行自动化。
当我获得当前视图(solo.getCurrentViews(ListView.class)
)时的层次结构类似于:
ListView
--> (0)FrameLayout
--> (1)RelativeLayout
--> (0)ImageView
--> (1)RelativeLayout
-->(0)ImageView
-->(1)TextView //id - name
-->(2)TextView //id - price
-->(3)TextView //id - other
--> (2)RelativeLayout
--> (0)ImageView
--> (1)RelativeLayout
-->(0)ImageView
-->(1)TextView //id - name
-->(2)TextView //id - price
-->(3)TextView //id - other
--> (3)RelativeLayout
--> (0)ImageView
--> (1)RelativeLayout
-->(0)ImageView
-->(1)TextView //id - name
-->(2)TextView //id - price
-->(3)TextView //id - other
--> (4)RelativeLayout
--> (0)ImageView
--> (1)RelativeLayout
-->(0)ImageView
-->(1)TextView //id - name
-->(2)TextView //id - price
-->(3)TextView //id - other
--> (5)RelativeLayout
--> (0)ImageView
--> (1)RelativeLayout
-->(0)ImageView
-->(1)TextView //id - name
-->(2)TextView //id - price
-->(3)TextView //id - other
我可以找出两种获取价格的方法:
遍历列表视图的子项并通过索引获取价格。如下面的代码
int index = 1;
ListView view = null;
List<ListView> productList = solo.getCurrentViews(ListView.class);
view = productList.get(0);
for (int i = 1; i < view.getChildCount(); i++) {
RelativeLayout relativeLayoutDetails = (RelativeLayout) view.getChildAt(index++); // get the first RelativeLayout
RelativeLayout productDetails = (RelativeLayout) relativeLayoutDetails.getChildAt(2); //get the inner child RelativeLayout
TextView productName = (TextView) productDetails.getChildAt(0);
System.out.println("********" + productDetails.getChildCount());
TextView price = (TextView) productDetails.getChildAt(2);
System.out.println(productName.getText().toString() + "---"+ price.getText().toString());
}
此代码的问题是TextView price = (TextView) hotelDetails.getChildAt(2);
没有给我price
但是给了我other
TextView(不知道为什么)。此外,这仅适用于当前视图。我无法向下滚动整个列表并获取每个产品的详细信息。
其次,获取当前视图的所有TextView
并根据price
ID过滤它们。如下所示:
ListView l =(ListView)solo.getView(android.R.id.list); int viewShown = l.getChildCount();
int total = l.getCount();
int i;
int index=1;
if (hotelsShown != 0) {
for (i = 0; i < total / viewShown; i++) {
List<TextView> textViews = solo.getCurrentViews(TextView.class, l); //get all the text views
//filter for price
for(TextView priceView: textViews){
if(priceView.id equals "price-id")
//get this TextView.
}
solo.scrollDown();
solo.sleep(500);
}
我使用这种方法遇到的问题是我不知道如何根据ID
过滤这些视图。此外,在滚动时,这会从当前视图中跳过一个或两个产品,但无法解决此问题。
如果有人可以就此提出建议,那就太棒了。
答案 0 :(得分:2)
我将参考我之前的一个答案,您可以使用它来查看列表here的索引。
一旦你有了这个,你可以将这个功能与一个新功能结合起来,获得一个视图的所有子元素:
private List<View> getAllChildren(View v) {
if (!(v instanceof ViewGroup)) {
ArrayList<View> viewArrayList = new ArrayList<View>();
viewArrayList.add(v);
return viewArrayList;
}
ArrayList<View> result = new ArrayList<View>();
ViewGroup viewGroup = (ViewGroup) v;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View child = viewGroup.getChildAt(i);
ArrayList<View> viewArrayList = new ArrayList<View>();
viewArrayList.add(v);
viewArrayList.addAll(getAllChildren(child));
result.addAll(viewArrayList);
}
return result;
}
然后最后一个是按id
过滤视图列表public View(List<View> views, int idToMatch) {
for (View view : views) {
if (view.getId() == idToMatch) {
return view;
}
}
return null;
}
你可以找出hwo将这些全部组合成一个能够很好地完成你想要的功能。 (提示一个R.id.price是一个整数,所以只要你有一个孩子在你想得到的索引中,就把它传递给最后一个功能)