AccessibilityNodeInfo.ACTION_CLICK无效

时间:2017-08-06 07:21:47

标签: android accessibilityservice

所以我是新手,并且一直在玩onAccessibilityEvent并阅读其他应用在屏幕上的TextViews,但效果很好,但现在我希望能够使用{{ 1}}点击其中一些。我的问题是,其他应用中的大部分AccessibilityNodeInfo.ACTION_CLICK都没有启用可点击功能,但是它们有一个可点击的TextViewandroid.widget.LinearLayout弹出窗口。但是我的代码似乎没有点击它们。有什么建议吗?

android.widget.FrameLayout

1 个答案:

答案 0 :(得分:2)

我认为你同意我的观点是:

List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByText(text); 
  

因为这个方法返回一个&#34; List&#34;,乍一看可能会想到   它返回此字符串中提到的所有节点。事实上,它   扫描字符串并返回包含而不是部分的所有节点   但整个字符串。

在你的程序中,给&#34; clickScreen&#34;包含所有视图文本。所以,你可以:

  • 只要您通过以下方式与其中一个见面,请点击该视图:

    if(child.isClickable()){
        child.performAction(AccessibilityNodeInfo.ACTION_CLICK);
    }
    

    如果您想要点击特定视图,您必须提前知道其文本或部分内容(注意&#34;确定&#34;和&#34;取消&#34;因为它会关闭屏幕):

    child.getText().toString().toLowerCase().contains()("your text");
    
  • 或者将所有这些都放在ArrayList中,然后点击你想要的内容:

    1. 填充ArrayList:

      //create new ArrayList
      public  ArrayList<AccessibilityNodeInfo> clickableViews = new ArrayList<>();
      
      private static void processSubEvent(final AccessibilityNodeInfo source, final int n, final StringBuilder sb) {
          ...
      if (child != null)
      {
          //fill the ArrayList with clickable views(make sure to put the origin reference because you will recycle child later)
          if(child.isClickable()) {
              clickableViews.add(source.getChild(i));
          }
          ...
      }
      
    2. 迭代列表并单击:

       for (AccessibilityNodeInfo view : clickableViews) {
          //We only want to click one view per function call! Clicking multiple 
          //views in rapid succession is error prone and functionally ambiguous 
          //meaning it might work in some use cases, and throw exceptions in others.
          if(view.performAction(AccessibilityNodeInfo.ACTION_CLICK)) break;
       }