在使用espresso进行测试的时候,点击一个横向列表的时候会在点击的项目下出现对应的横线。

实现方式是在FrameLayout下放两个TextView,

一个TextView包含下划线,默认是FrameLayout的第一个元素;

一个TextView不包含下划线,默认是FrameLayout的第二个元素;

两个元素大小一致,当选中时,切换1,2两个TextView的属性。

espresso使用的matcher为:

  

Matcher<View> viewLabel = allOf(withClassName(endsWith("TextView")), isNotCoveredByBothers(), withAlpha(1.0f), isDisplayed(), isDescendantOfA(withId(TABS)));

TABS是列表的祖先元素。
查看代码发现 两个TextView 区别就是 Alpha 值不一样,有下划线的 Alpha 值为1.0.(设置这个值为什么会有这样的下划线)。
    /**
* isNotCoveredByBothers
* @return
*/
public static Matcher<View> isNotCoveredByBothers() {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("is displayed on the screen to the user");
} @Override
public boolean matchesSafely(View view) {
return view.getGlobalVisibleRect(new Rect())
&& !isViewCoveredBybrothers(view);
}
};
} /**
* 检查一个包含父控件的view是否被后面的兄弟遮挡
* 检查一个包含父控件的view是否被后面的兄弟遮挡
* @param view
* @return
*/
public static boolean isViewCoveredBybrothers(final View view) {
View currentView = view;
if (currentView.getParent() == null) {
//无父控件,当作未遮挡
return false;
}
if (currentView.getParent() instanceof ViewGroup) {
ViewGroup currentParent = (ViewGroup) currentView.getParent();
// if the parent of view is not visible,return true
if (currentParent.getVisibility() != View.VISIBLE) {
//父控件不可见
return true;
} int start = indexOfViewInParent(currentView, currentParent);
for (int i = start + 1; i < currentParent.getChildCount(); i++) {
Rect viewRect = new Rect();
view.getGlobalVisibleRect(viewRect);
View otherView = currentParent.getChildAt(i);
Rect otherViewRect = new Rect();
otherView.getGlobalVisibleRect(otherViewRect);
// if view intersects its older brother(covered),return true
if (Rect.intersects(viewRect, otherViewRect)) {
return true;
}
}
}
return false;
} /**
* view在parent的index
* @param view
* @param parent
* @return
*/
private static int indexOfViewInParent(View view, ViewGroup parent) {
int index;
for (index = 0; index < parent.getChildCount(); index++) {
if (parent.getChildAt(index) == view) {
break;
}
}
return index;
}

espresso 元素遮挡问题。的更多相关文章

  1. HTML元素遮挡Flash之梦

    wmode参数: transparent模式:可用z-index控制层级 opaque模式:可用z-index控制层级 window模式:flash层级在浏览器核心显示窗口之上,flash会盖住与他重 ...

  2. 防止fixed元素遮挡其他元素的方法

    有多个页面,有的有固定的头部(设置了postion:fixed的元素),有的没有固定的头部,这时就有个问题,有固定头部的页面,头部会遮挡下面的内容,那怎么解决呢? <!DOCTYPE html& ...

  3. IE下object元素遮挡div表单

    目前遇到这样的一个问题: 我用ActiveX插件做了一个C#的播放器,要将这个插件放到web浏览器中,然后可以通过前台页面来控制视频的播放,暂停还有回放,这个时候发现object的onclick事件无 ...

  4. CSS 解决z-index上层元素遮挡下层元素点击事件问题

    解决z-index上层元素遮挡下层元素点击事件问题 by:授客 QQ:1033553122 开发环境 Win 10 element-ui  "2.8.2" Vue 2.9.6 需求 ...

  5. ie6绝对定位的块会被select元素遮挡的解决方案

    RT(已无力吐槽ie),解决方法是:定义一个iframe,与想要显示的绝对定位的块设置为同一大小.放在同一个位置上.我的网页里绝对定位的元素是会随着鼠标移动显示和隐藏的,于是这个frame也要跟着显示 ...

  6. 子元素z-index高于父元素兄弟元素z-index被遮挡问题

    问题:最近在写样式时,遇到一个这样的问题,子元素的z-index值大于父元素兄弟元素z-index值,结果子元素超出父元素部分被父元素兄弟元素遮挡解决:将父元素的z-index值设置为大于兄弟元素z- ...

  7. 元素堆叠问题、z-index、position

    多次在项目中遇到html页面元素的非期待重叠错误,多数还是position定位情况下z-index的问题.其实每次解决类似问题思路大致都是一样的,说到底还是对z-index的理解比较模糊,可以解决问题 ...

  8. IE6、7绝对定位层被遮挡的原因(主要是父层决定的)

    最近做项目,经常遇到IE7以下浏览器中.一些悬浮框被一些元素遮挡的问题,这些元素一般都是设置了position的.问题的根本在不是被设置绝对定位的元素上,而是在设置了相对定位的父元素上.   我查阅了 ...

  9. 浅析CSS——元素重叠及position定位的z-index顺序

    多次在项目中遇到html页面元素的非期待重叠错误,多数还是position定位情况下z-index的问题.其实每次解决类似问题思路大致都是一样的,说到底还是对z-index的理解比较模糊,可以解决问题 ...

随机推荐

  1. 【python基础】--常用数据结构

    list tuple dict set四种常用数据结构 list list 有序的集合,可以随时添加.删除其中元素值; 支持list嵌套模式, >>> p = ['a','b']&g ...

  2. jquery.color.js

    经过测试,可以使用. 2016-12-22  21:39:45 /*! * jQuery Color Animations v2.1.2 * https://github.com/jquery/jqu ...

  3. 有许多部分没有在cgroup中显示啊,current/high/low/min等等

    没看见current/high/low/min 在cgroup中的显示内容

  4. gdb调试的艺术——Debug技巧

    调试的艺术——Debug技巧总结 (本文从写好的wiki里粘出来的,格式稍乱不影响阅读) 用Q+编号代表问题,A+编号代表答案.用这种方式组织.如无特别说明,这些技巧都是针对Visual Studio ...

  5. Share single RDM between multiple VM's in ESX

    1.Create a VM01 on esx01,Create a VM02 on esx02 2.Create the RDM on your VM01 (using the virtual, no ...

  6. Linux命令之rhn_check

    NAME rhn_check - check for queued actions on RHN and execute them SYNOPSIS /usr/sbin/rhn_check [-v] ...

  7. SQL 设置自增,和default

    mysql数据库为表中已有的主键字段增加自增属性: ALTER TABLE `category ` MODIFY COLUMN `id` int(11) NOT NULL AUTO_INCREMENT ...

  8. 获得touch事件,jquery绑定事件监听器,ios设备上打开touch状态以响应focus,active等伪类

    2. 默认的监听方式 document.addEventListener('touchstart', function(){ alert('hello'); }, false); 使用jquery时 ...

  9. 50 days before NOI2017

    2017.5.31 今天开了这个博客,打算每天来写点东西,嗯...毕竟要NOI了嘛... 第一天跑到常州里集训,打开题目一看湖南集训题... T1刷一下写完,然后交了然后发现错了...赶紧改过来,大概 ...

  10. Gradle for Android(二)全局设置、自定义BuildConfig

    全局设置 如果有很多项目,可以设置全局来统一管理版本号或依赖库,根目录下build.gradle下: ext { compileSdkVersion = 23 buildToolsVersion = ...