我在Android中创建了一个AccessibilityService,我想在关注页面上的EditText后显示一个AlertDialog(注意:EditText可能来自另一个应用程序,比如登录屏幕,所以我并不总是知道ID)。当您单击 AlertDialog 中的“确认”按钮时,它会使用文本填充该 EditText。
除了最后一部分之外,我已完成所有步骤...我不知道如何用文本填充 EditText。我猜测有一种方法可以在某处转换 findViewByID() 方法,但我不知道如何找到 EditText 的 ID(参见上文,EditText 可能来自另一个应用程序)。请参阅下面的代码,我离题了吗?下面的代码总是错误地告诉我有关密封实例的问题(无法在未密封的实例上执行此操作。)。
public void onAccessibilityEvent(final AccessibilityEvent event) {
final AccessibilityNodeInfo source = event.getSource();
if ((event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED || event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED) && CLASS_NAME_EDIT_TEXT.equals(event.getClassName())) {
AlertDialog.Builder mSuspendDialog = new AlertDialog.Builder(getApplicationContext())
.setTitle(R.string.str_have_password_question)
.setPositiveButton(R.string.str_decision_use_password, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
if (event.getSource() != null & event.getClassName().equals("android.widget.EditView")) {
Bundle arguments = new Bundle();
arguments.putCharSequence(AccessibilityNodeInfo
.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "newtexttopopulateedittext");
event.getSource().performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
}
}
})
.setNegativeButton(R.string.str_decision_close, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
AlertDialog alert11 = mSuspendDialog.create();
// Ensure we can show the dialog from this service.
alert11.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alert11.show();
最佳答案
1) 当任何 Activity 启动时,创建屏幕上所有 EditText
的 ID 的 列表
(或其他内容)。
2) 在创建列表时(或稍后)再次迭代该列表,并检查 SQLite 数据库中该 View 的值是否可用。
3) 如果值可用,请使用 ACTION_PASTE 在该 EditText 中注入(inject)文本。
ArrayList<AccessibilityNodeInfo> inputViewsList = new ArrayList<AccessibilityNodeInfo>();
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
refreshChildViewsList(rootNode);
for(AccessibilityNodeInfo mNode : inputViewsList){
String viewId = mNode.getViewIdResourceName();
Cursor cr = db.rawQuery(-----your database parameters----);
if(cr.moveToFirst()){
//this means you have a value for that ET
ClipboardManager clipboardManager = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
ClipData clipData =ClipData.newPlainText("MyAppName", cr.getString(--Your column number--));
clipboardManager.setPrimaryClip(clipData);
mNode.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
}
必须使用数据库,以便您可以永久记住这些值。我上面得到的 ID 是一个完全限定的 ID,包含应用程序包名称和 View ID。因此,它在整个系统范围内仍然是独一无二的。
现在了解 refreshChildViews()
方法:
private void refreshChildViews(AccessibilityNodeInfo rootNode){
int childCount = rootNode.getChildCount();
for(int i=0; i<childCount ; i++){
AccessibilityNodeInfo tmpNode = rootNode.getChildAt(i);
int subChildCount = tmpNode.getChildCount();
if(subChildCount==0){
if(tmpNode.getClassName().toString().contentEquals("android.widget.EditText"){
inputViewsList.add(tmpNode);
}
return;
}
if(subChildCount>0){
refreshChildViews(tmpNode);
}
}
}
不要忘记在 TYPE_WINDOW_STATE_CHANGED
事件中清除 inputViewsList
!
如果您还需要任何其他信息,请告诉我。
关于android - AccessibilityService 从 AlertDialog 更改 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29504854/