Я создал AccessibilityService в Android, где я хочу отобразить AlertDialog после фокусировки на EditText на странице (Примечание: EditText может быть из другого приложения, например, экрана входа в систему, поэтому я не всегда буду знать идентификатор). Когда вы нажимаете кнопку «подтвердить» в AlertDialog, он заполняет этот EditText текстом.
У меня выполнены все шаги, кроме последней части... Я не могу понять, как заполнить EditText текстом. Я предполагаю, что есть способ где-то применить метод findViewByID(), но я не знаю, как найти идентификатор EditText (см. выше, 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();