- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我是新手,一直在玩弄 onAccessibilityEvent
并阅读来自其他应用程序屏幕上的 TextViews
,它运行良好,但现在我想能够使用 AccessibilityNodeInfo.ACTION_CLICK
来点击其中的一些。我的问题是其他应用程序中的大多数 TextView
都没有打开可点击功能,但它们有一个弹出窗口位于 android.widget.LinearLayout
或 android.widget.FrameLayout
可点击。但我的代码似乎并没有点击它们。有什么建议吗?
public class AutoService extends AccessibilityService
{
@TargetApi(16)
@Override
public void onAccessibilityEvent(AccessibilityEvent event)
{
AccessibilityNodeInfo source = event.getSource();
myAdapter.processEvent(source);
}
}
public class myAdapter
{
public static void processEvent(final AccessibilityNodeInfo source)
{
final StringBuilder sb = new StringBuilder();
processSubEvent(source, 0, sb);
final String string = sb.toString();
if (string == null)
{
return;
}
clickScreen(source, string.toLowerCase());
}
private static void processSubEvent(final AccessibilityNodeInfo source, final int n, final StringBuilder sb) {
for (int i = 0; i < n; ++i) {
sb.append("\t");
}
if (source != null)
{
sb.append(source.getText());
sb.append("\n");
final int childCount = source.getChildCount();
for (int i = 0; i < childCount; i++)
{
AccessibilityNodeInfo child = source.getChild(i);
processSubEvent(child, n + 1, sb);
if (child != null)
{
child.recycle();
}
}
}
}
private static void clickScreen(final AccessibilityNodeInfo source, final String text)
{
List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByText(text);
for (final AccessibilityNodeInfo node : list)
{
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
最佳答案
我认为您同意我的看法,问题出在:
List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByText(text);
as this method returns a "List", may come to mind at first glance that it returns all the nodes which mentioned in this string. In fact, it scans the string and returns all the nodes that contains, not a part, but the whole string.
在您的程序中,给“clickScreen”的字符串包含所有 View 的文本。因此,您可以:
每当您通过以下方式与其中一位会面时单击 View :
if(child.isClickable()){
child.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
如果你想点击一个特定的 View ,你必须事先知道它的文本或部分内容(注意“确定”和“取消”,因为它会关闭屏幕):
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;
}
关于android - AccessibilityNodeInfo.ACTION_CLICK 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529604/
所以我是新手,一直在玩弄 onAccessibilityEvent 并阅读来自其他应用程序屏幕上的 TextViews,它运行良好,但现在我想能够使用 AccessibilityNodeInfo.AC
我是一名优秀的程序员,十分优秀!