【问题标题】:Robotium - How to check view's visibility valueRobotium - 如何检查视图的可见性值
【发布时间】: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。

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

先谢谢了。

【问题讨论】:

    标签: android android-studio android-testing robotium ui-testing


    【解决方案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 代码,所以这不相等。不要在目的是听众的地方使用循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 2014-08-06
    • 2015-01-30
    • 1970-01-01
    • 2020-10-05
    • 2012-09-09
    相关资源
    最近更新 更多