所以我是新手,并且一直在玩onAccessibilityEvent
并阅读其他应用在屏幕上的TextViews
,但效果很好,但现在我希望能够使用{{ 1}}点击其中一些。我的问题是,其他应用中的大部分AccessibilityNodeInfo.ACTION_CLICK
都没有启用可点击功能,但是它们有一个可点击的TextView
或android.widget.LinearLayout
弹出窗口。但是我的代码似乎没有点击它们。有什么建议吗?
android.widget.FrameLayout
答案 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中,然后点击你想要的内容:
填充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));
}
...
}
迭代列表并单击:
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;
}