Robotium - 如何检查视图的可见性值

Posted

技术标签:

【中文标题】Robotium - 如何检查视图的可见性值【英文标题】:Robotium - How to check view's visibility value 【发布时间】:2016-09-06 12:51:58 【问题描述】:

我想检查视图是否可见,所以我在视图上使用了 isShown() 方法,但它非常没用,因为我创建了自己的视图并且这些依赖于 id,所以这里是示例视图:

private static final String BTN_ADD_CURRENCY_ALERT = "action_add_currency_alert";

private View btn_AddAlert() 
    return mainHelper.getView(BTN_ADD_CURRENCY_ALERT);

这是getView()的主体;

public View getView(String id) 
    return solo.getView(id);

然后我想看看这个元素是否可见(如果不可见则返回 false)。

我这样称呼它

if (btn_addAlert().isShown())...

问题是,当我调用 btn_addAlert() 并且视图不可见时,我得到 AssertionFailedError 并且它甚至不会进入 isShown()。

我发现异常

private boolean catcher() 
    try 
        btn_addAlert().isShown();
        return true;
     catch (AssertionFailedError e) 
        return false;
    

但这是错误的方式,因为异常不适用于此,而且我必须等待整个超时时间才能使其抛出异常。然后它就返回 false。

那么在这种情况下我该怎么办?

先谢谢了。

【问题讨论】:

【参考方案1】:

你可以检查一下

 if(v.getVisibility() == View.VISIBLE)
       // do you stuff here

【讨论】:

我觉得他的问题比较复杂。这不仅仅是如何找到函数“isShown”。 btn_addAlert() - 这就是问题所在。它不会改变什么,因为 getVisibility() 不会被强制转换。【参考方案2】:

假设您已经在使用这种方法:

public View getView(String id) 
    return solo.getView(id);

要检查此视图是否可见,您可以使用:

 switch (getView("R.id.button").getVisibility()) 
        case (View.VISIBLE): 
            break;
        
        case (View.INVISIBLE): 
            break;
        

        case (View.GONE): 
            break;
        
        default:
            break;
    

在您的具体情况下,请尝试使用 btn_addAlert().getVisibility() 而不是 getView("R.id.button").getVisibility()

希望对你有帮助

编辑:尝试使用这些侦听器之一检查视图的可见性是否已更改:

使用ViewTreeObserver().addOnGlobalLayoutListener

   btn_addAlert().setTag(myView.getVisibility());
   btn_addAlert().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() 
    @Override
    public void onGlobalLayout() 
        int newVis = btn_addAlert().getVisibility();
        if((int)btn_addAlert().getTag() != newVis) 
            btn_addAlert().setTag(myView.getVisibility());
            //visibility has changed
           //here you can use my "switch" statement
        
    
 );

检查:Handle a view visibility change without overriding the view

使用OnSystemUiVisibilityChangeListener:

View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
    (new View.OnSystemUiVisibilityChangeListener() 
    @Override
    public void onSystemUiVisibilityChange(int visibility) 
        // Note that system bars will only be "visible" if none of the
        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) 
            // TODO: The system bars are visible. Make any desired
            // adjustments to your UI, such as showing the action bar or
            // other navigational controls.
         else 
           // TODO: The system bars are NOT visible. Make any desired
           // adjustments to your UI, such as hiding the action bar or
           // other navigational controls.
        
    
);

检查:https://developer.android.com/training/system-ui/visibility.html

【讨论】:

这只是下面答案的切换版本。我想做一些事情,直到视图可见,所以使用 while 循环,但如果视图不可见,它不会返回 false 并跳过循环。它会抛出异常并将我的测试标记为失败。当我 getView 并且视图不可见时它会崩溃,因为它正在搜索它,它已经消失了,所以它抛出了一个异常。 不。下面的人使用的是神秘的v,我使用的是直接的Robotium 代码,所以这不相等。不要在目的是听众的地方使用循环

以上是关于Robotium - 如何检查视图的可见性值的主要内容,如果未能解决你的问题,请参考以下文章

更改列表视图中图像的可见性

如何将图像视图的可见性设置为 Spinner 所选项目的可见性

如何通过方向更改控制视图可见性(可见/不可见)? [复制]

如何在swift 3中恢复标签可见性状态

Espresso - 如何匹配 ActionBar 的可见性?

如何从活动中更改片段中视图的可见性