onChildView和hasSiblings与长者preSSO长者、onChildView、hasSiblings、preSSO

2023-09-08 09:07:56 作者:细呷温酒

我想从一个特定的视图访问一个按钮。同样的视图6倍。这是code我使用。

 公共无效testTimeConfig(){
    。昂达(withDesc(说明))onChildView(withId(R.id.positive))执行(点击());
}

私有静态匹配器<对象> withDesc(desc字符串){
    返回allOf(被(INSTANCEOF(为String.class)),是(递减));
}
 

当我跑,我得到一个错误:

  

在视图中执行装入适配器的数据错误是从类分配:类android.widget.AdapterView。

这是访问一个孩子认为最好的方法是什么?如果是这样,怎么样?

修改

这是在code我想现在使用。

  OnView为(allOf((withContentDescription(说明)),hasSibling(withContentDescription(SettingsLayout)),hasSibling(withId(R.id.positive))))。执行(点击());
 

  OnView为(allOf((withContentDescription(说明)),hasSibling(withId(R.id.positive))))执行(点击());
 

与此错误:

 的体系中没有的观点找到匹配
 

的XML

 <查看
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_below =@ ID / setAGoalTitle
        机器人:layout_alignParentLeft =真
        类=com.xxx
        机器人:layout_marginTop =30dp
        机器人:ID =@ + ID / timeGoalWidget
        应用程序:goalLabel =@字符串/ time_min_upper
        应用程序:图标=@可绘制/ ic_icn_summary_time
        应用程序:步长=300
        应用程序:valueFormat =时间
        机器人:重力=center_horizo​​ntal
        机器人:layout_marginBottom =60dp
        机器人:contentDescription =setAGoalTimeConfigurator/>

    <查看
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_alignParentRight =真
        机器人:layout_alignTop =@ ID / timeGoalWidget
        类=com.xxx
        机器人:ID =@ + ID / distanceGoalWidget
        应用程序:goalLabel =@字符串/ distance_upper
        应用程序:图标=@可绘制/ ic_icn_summary_track
        应用程序:步长=0.25
        应用程序:valueFormat =decimal_two
        机器人:重力=center_horizo​​ntal
        机器人:contentDescription =setAGoalDistanceConfigurator/>

    <查看
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_below =@ ID / timeGoalWidget
        机器人:layout_alignLeft =@ ID / timeGoalWidget
        类=com.xxx
        机器人:ID =@ + ID / paceGoalWidget
        应用程序:goalLabel =@字符串/ pace_upper
        应用程序:图标=@可绘制/ ic_icn_summary_pace
        应用程序:valueFormat =时间
        应用程序:步长=10
        机器人:重力=center_horizo​​ntal
        机器人:layout_marginBottom =60dp
        机器人:contentDescription =setAGoalPaceConfigurator/>


    <查看
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_alignRight =@ ID / distanceGoalWidget
        机器人:layout_alignTop =@ ID / paceGoalWidget
        类=com.xxx
        机器人:ID =@ + ID / speedGoalWidget
        应用程序:goalLabel =@字符串/ speed_upper
        应用程序:图标=@可绘制/ ic_icn_summary_speed
        应用程序:步长=0.5
        应用程序:valueFormat =decimal_two
        机器人:重力=center_horizo​​ntal
        机器人:contentDescription =setAGoalSpeed​​Configurator/>


    <查看
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_below =@ ID / paceGoalWidget
        机器人:layout_alignLeft =@ ID / paceGoalWidget
        类=com.xxx
        机器人:ID =@ + ID / inclineGoalWidget
        应用程序:goalLabel =@字符串/ incline_percent_upper
        应用程序:图标=@可绘制/ ic_icn_summary_elevation
        应用程序:步长=0.5
        应用程序:valueFormat =decimal_two
        机器人:重力=center_horizo​​ntal
        机器人:contentDescription =setAGoalInclineConfigurator/>


    <查看
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_alignRight =@ ID / speedGoalWidget
        机器人:layout_alignTop =@ ID / inclineGoalWidget
        类=com.xxx
        机器人:ID =@ + ID / caloriesGoalWidget
        应用程序:goalLabel =@字符串/ calories_upper
        应用程序:图标=@可绘制/ ic_icn_summary_calories
        应用程序:步长=10
        应用程序:valueFormat =decimal_zero
        机器人:重力=center_horizo​​ntal
        机器人:contentDescription =setAGoalCaloriesConfigurator/>


< / RelativeLayout的>
 

这是用于6次视图的XML。

 <的ImageButton
    机器人:ID =@ + ID / increaseGoalButton
    机器人:layout_height =@扪/ view_goal_setting_incrementor_button_height_width
    机器人:layout_width =@扪/ view_goal_setting_incrementor_button_height_width
    机器人:背景=@可绘制/ button_goal_widget
    机器人:重力=中心
    机器人:SRC =@可绘制/ ic_plus
    机器人:TEXTSIZE =@扪/ view_goal_setting_incrementor_button_text_size
    机器人:文字颜色=@色/ goal_configuration_widget_button_text_color
    机器人:layout_alignParentRight =真
    机器人:layout_alignParentTop =真
    机器人:layout_marginBottom =1DP
    机器人:contentDescription =@字符串/加/>

<的ImageButton
    机器人:ID =@ + ID / decreaseGoalButton
    机器人:layout_height =@扪/ view_goal_setting_incrementor_button_height_width
    机器人:layout_width =@扪/ view_goal_setting_incrementor_button_height_width
    机器人:背景=@可绘制/ button_goal_widget
    机器人:重力=中心
    机器人:SRC =@可绘制/ ic_minus
    机器人:TEXTSIZE =@扪/ view_goal_setting_incrementor_button_text_size
    机器人:layout_alignParentRight =真
    机器人:文字颜色=@色/ goal_configuration_widget_button_text_color
    机器人:layout_below =@ ID / increaseGoalButton
    机器人:contentDescription =@字符串/减少/>

<的LinearLayout
    机器人:ID =@ + ID / goalWidgetValueContainer
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT
    机器人:方向=垂直
    机器人:layout_toLeftOf =@ ID / increaseGoalButton
    机器人:layout_centerVertical =真
    机器人:重力=center_vertical |右
    机器人:layout_marginRight =@扪/ view_goal_setting_value_margin_right>

    <的TextView
        机器人:ID =@ + ID / goalValueTextView
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_width =WRAP_CONTENT
        机器人:文字颜色=@色/ goal_configuration_widget_value_text_color
        机器人:TEXTSIZE =@扪/ view_goal_setting_value_text_size
        机器人:lineSpacingExtra = -  10SP
        应用程序:字体=proxima_bold
        机器人:文本=999:00/>

    <的TextView
        机器人:ID =@ + ID / goalValueLabelTextView
        机器人:layout_height =WRAP_CONTENT
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_gravity =右
        机器人:TEXTSIZE =@扪/ view_goal_setting_value_label_text_size
        机器人:文字颜色=@色/ goal_configuration_widget_value_text_color
        机器人:includeFontPadding =假
        机器人:lineSpacingExtra =10SP
        机器人:文本=@字符串/ incline_percent_upper/>

< / LinearLayout中>
 

这是id为ImageView的 increaseGoalButton ,我想点击。

解决方案

根据你应该用你的最后一个注释 OnView为()而不是昂达()。 我想,你就可以用点击按钮 hasSibling() - 的例如

  OnView为(allOf(withId(R.id.positive),hasSibling(withDesc(someString))))
    .perform(点击());
 

或例子不自定义匹配(兄弟视图有文字):

  OnView为(allOf(withId(R.id.positive),hasSibling(withText(someString))))
    .perform(点击());
 

或(兄弟姐妹视图具有内容描述):

  OnView为(allOf(withId(R.id.positive),hasSibling(withContentDescription(someString))))
    .perform(点击());
 

编辑:

OK,我会尝试这两个变种:

  OnView为(allOf(withId(R.id.increaseGoalButton),isDescendantOfA(withId(R.id.timeGoalWidget))))
    .perform(点击());
 

  OnView为(allOf(withId(R.id.increaseGoalButton),withParent(withId(R.id.timeGoalWidget))))
    .perform(点击());
 

I am trying to access a button from a specific view. The same view is displayed 6 times. This is the code I am using.

public void testTimeConfig(){
    onData(withDesc("description")).onChildView(withId(R.id.positive)).perform(click());
}

private static Matcher<Object> withDesc(String desc) {
    return allOf(is(instanceOf(String.class)), is(desc));
}

When I run, I get an error:

Error performing 'load adapter data' on view 'is assignable from class: class android.widget.AdapterView'.

Is this the best way to access a child view? If so, how?

EDIT

This is the code I am trying to use now.

   onView(allOf((withContentDescription("description")), hasSibling(withContentDescription("SettingsLayout")), hasSibling(withId(R.id.positive)))).perform(click());

and

   onView(allOf((withContentDescription("description")), hasSibling(withId(R.id.positive)))).perform(click());

With this Error:

   No views in hierarchy found matching

The xml

    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/setAGoalTitle"
        android:layout_alignParentLeft="true"
        class="com.xxx"
        android:layout_marginTop="30dp"
        android:id="@+id/timeGoalWidget"
        app:goalLabel="@string/time_min_upper"
        app:icon="@drawable/ic_icn_summary_time"
        app:step="300"
        app:valueFormat="time"
        android:gravity="center_horizontal"
        android:layout_marginBottom="60dp"
        android:contentDescription="setAGoalTimeConfigurator"/>

    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/timeGoalWidget"
        class="com.xxx"
        android:id="@+id/distanceGoalWidget"
        app:goalLabel="@string/distance_upper"
        app:icon="@drawable/ic_icn_summary_track"
        app:step="0.25"
        app:valueFormat="decimal_two"
        android:gravity="center_horizontal"
        android:contentDescription="setAGoalDistanceConfigurator"/>

    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/timeGoalWidget"
        android:layout_alignLeft="@id/timeGoalWidget"
        class="com.xxx"
        android:id="@+id/paceGoalWidget"
        app:goalLabel="@string/pace_upper"
        app:icon="@drawable/ic_icn_summary_pace"
        app:valueFormat="time"
        app:step="10"
        android:gravity="center_horizontal"
        android:layout_marginBottom="60dp"
        android:contentDescription="setAGoalPaceConfigurator"/>


    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@id/distanceGoalWidget"
        android:layout_alignTop="@id/paceGoalWidget"
        class="com.xxx"
        android:id="@+id/speedGoalWidget"
        app:goalLabel="@string/speed_upper"
        app:icon="@drawable/ic_icn_summary_speed"
        app:step="0.5"
        app:valueFormat="decimal_two"
        android:gravity="center_horizontal"
        android:contentDescription="setAGoalSpeedConfigurator"/>


    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/paceGoalWidget"
        android:layout_alignLeft="@id/paceGoalWidget"
        class="com.xxx"
        android:id="@+id/inclineGoalWidget"
        app:goalLabel="@string/incline_percent_upper"
        app:icon="@drawable/ic_icn_summary_elevation"
        app:step="0.5"
        app:valueFormat="decimal_two"
        android:gravity="center_horizontal"
        android:contentDescription="setAGoalInclineConfigurator"/>


    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@id/speedGoalWidget"
        android:layout_alignTop="@id/inclineGoalWidget"
        class="com.xxx"
        android:id="@+id/caloriesGoalWidget"
        app:goalLabel="@string/calories_upper"
        app:icon="@drawable/ic_icn_summary_calories"
        app:step="10"
        app:valueFormat="decimal_zero"
        android:gravity="center_horizontal"
        android:contentDescription="setAGoalCaloriesConfigurator"/>


</RelativeLayout>

The view xml that is used 6 times.

<ImageButton
    android:id="@+id/increaseGoalButton"
    android:layout_height="@dimen/view_goal_setting_incrementor_button_height_width"
    android:layout_width="@dimen/view_goal_setting_incrementor_button_height_width"
    android:background="@drawable/button_goal_widget"
    android:gravity="center"
    android:src="@drawable/ic_plus"
    android:textSize="@dimen/view_goal_setting_incrementor_button_text_size"
    android:textColor="@color/goal_configuration_widget_button_text_color"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_marginBottom="1dp"
    android:contentDescription="@string/increase"/>

<ImageButton
    android:id="@+id/decreaseGoalButton"
    android:layout_height="@dimen/view_goal_setting_incrementor_button_height_width"
    android:layout_width="@dimen/view_goal_setting_incrementor_button_height_width"
    android:background="@drawable/button_goal_widget"
    android:gravity="center"
    android:src="@drawable/ic_minus"
    android:textSize="@dimen/view_goal_setting_incrementor_button_text_size"
    android:layout_alignParentRight="true"
    android:textColor="@color/goal_configuration_widget_button_text_color"
    android:layout_below="@id/increaseGoalButton"
    android:contentDescription="@string/decrease"/>

<LinearLayout
    android:id="@+id/goalWidgetValueContainer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_toLeftOf="@id/increaseGoalButton"
    android:layout_centerVertical="true"
    android:gravity="center_vertical|right"
    android:layout_marginRight="@dimen/view_goal_setting_value_margin_right" >

    <TextView
        android:id="@+id/goalValueTextView"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:textColor="@color/goal_configuration_widget_value_text_color"
        android:textSize="@dimen/view_goal_setting_value_text_size"
        android:lineSpacingExtra="-10sp"
        app:typeface="proxima_bold"
        android:text="999:00"/>

    <TextView
        android:id="@+id/goalValueLabelTextView"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_gravity="right"
        android:textSize="@dimen/view_goal_setting_value_label_text_size"
        android:textColor="@color/goal_configuration_widget_value_text_color"
        android:includeFontPadding="false"
        android:lineSpacingExtra="10sp"
        android:text="@string/incline_percent_upper"/>

</LinearLayout>

It is the ImageView with id increaseGoalButton that I am trying to click.

解决方案

Based on your last comment you should use onView() instead of onData(). I think you'll be able to click the button using hasSibling() - example

onView(allOf(withId(R.id.positive), hasSibling(withDesc(someString))))
    .perform(click());

or examples without your custom matcher (sibling view has text):

onView(allOf(withId(R.id.positive), hasSibling(withText(someString))))
    .perform(click());

or (sibling view has content description):

onView(allOf(withId(R.id.positive), hasSibling(withContentDescription(someString))))
    .perform(click());

EDITED:

OK, I'd try these two variants:

onView(allOf(withId(R.id.increaseGoalButton), isDescendantOfA(withId(R.id.timeGoalWidget))))
    .perform(click());

or

onView(allOf(withId(R.id.increaseGoalButton), withParent(withId(R.id.timeGoalWidget))))
    .perform(click());