Отправляет email-рассылки с помощью сервиса Sendsay

[prg] Не добавляется виртуальное view к реальному view в android

Всех приветствую. У меня не получилось добавить одно виртуальное view к
реальному view. Я видел в исходниках telegram,что это делается,но там
добавляются виртуальные view для разных ситуаций,а у меня задача пока
что просто добавить одно виртуальное view к реальному view. Самое
непонятное,что когда я стал использовать класс
accessibilityNodeProvider,talkback не видит даже реальное view,хотя если
мы возвращаем null в методе класса View getAccessibilityNodeProvider.
Это и неудивительно,поскольку,судя по исходникам android,вроде метод
класса View onInitializeAccessibilityNodeInfo использует метод
createAccessibilityNodeInfo класса accessibilityNodeProvider,т.е как раз
тот метод,который я переопределяю,а значит я что-то делаю неправильно.
Вопрос в том,что же я делаю неправильно,т.е почему не реального,не
виртуального view talkback не видит. Я создал репозиторий,чтобы те,кто
захочет мне помочь,смогли посмотреть мой код. Вы можете сделать это на
https://github.com/AlexandrKozlovskiy/test. Заранее всем огромное
спасибо за помощь.

Ответить   Mon, 13 Jul 2020 03:25:32 +0300 (#3654828)

 

Ответы:

Приветствую всех!
В принципе, ваш код должен работать.
Подход верный -- переопределить getAccessibilityNodeProvider() и передать свою реализацию AccessibilityNodeProvider.
Другой вариант -- использовать setAccessibilityDelegate() и передать свою реализацию AccessibilityDelegate. В этом случае не надо наследовать свой view от требуемого.
Проблема, скорее всего, в том, что вы используете тосты для отладки, а они не все и не всегда успевают озвучиваться TalkBack.
Используйте системный лог.
Также попробуйте для начала осуществлять навигацию по виртуальным view с помощью фокуса доступности, так как эти виртуальные view предназначены для него.
Пример рабочего варианта AccessibilityNodeProvider:
private final AccessibilityNodeProvider mProvider = new AccessibilityNodeProvider() {

@Override

public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) {

if(virtualViewId== View.NO_ID) {

AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(CustomizedEditText.this);

onInitializeAccessibilityNodeInfo(info);

info.setParent((View) getParentForAccessibility());

info.setContentDescription("Test of contentDescription of parent");

info.addChild(CustomizedEditText.this,0);

return info;

} else {

AccessibilityNodeInfo info =AccessibilityNodeInfo.obtain();

info.setContentDescription("virtual contentDescription");

info.setSource(CustomizedEditText.this,virtualViewId);

info.setParent(CustomizedEditText.this);

info.setPackageName(getContext().getPackageName());

info.setClassName(EditText.class.getName());

info.addAction(AccessibilityNodeInfo.ACTION_CLICK);

info.addAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS);

info.setText("virtual text");

info.setEnabled(true);

return info;

}

}

@Override

public boolean performAction(int virtualViewId, int action, Bundle arguments) {

Log.v(TAG, "perform action: " + action +" virtual view: " + virtualViewId);

if(action==AccessibilityNodeInfo.ACTION_CLICK)

Log.v(TAG, "action click");

if(action==AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS)

Log.v(TAG, "action acc focused");

return super.performAction(virtualViewId, action, arguments);

}

};

Успехов. Анатолий.
Исходное сообщение > а у меня задача пока

[...]

Ответить   "i_chay" Wed, 22 Jul 2020 01:23:05 +0300 (#3655252)

 

Здравствуйте Анатолий. Я пытался использовать похожий алгоритм,но у меня
talkback не видит view. Я решил эту проблему по-другому и обновил
репозиторий https://github.com/AlexandrKozlovskiy/test. Идея в том,чтобы
посылать accessibilityEvent типа AccessibilityFocused,когда отрабатывает
соответствующий action. Координаты в моём коде взяты с потолка,хотя в
случае с ссылками их нужно будет как-то рассчитывать самостоятельно.
Ещё,как я понял по исходникам telegram,чтобы мы могли находить эти
виртуальные view прощупыванием,нам надо переопределить вроде метод
класса View onHoverEvent,и там уже смотреть на координаты motionEvent.
Кстати ещё сложность расчёта координат ссылок,т.е виртуальных View
заключается в том,что,как я понимаю,при прокрутке нам надо считать
координаты ссылок с нуля и надо понять,на каком виртуальном view
добавлять action scroll,ведь текста может быть очень много.
Может,конечно,той прокрутки,которая реализована в программе изначально и
достаточно для этого,но мне кажется,что при добавлении виртуальных View
мне тоже надо будет учитывать прокрутку. Ещё мне непонятно,какие
координаты устанавливает метод класса accessibilityNodeInfo
setBoundsInParent? Вот метод setBoundsInScreen,как я понял,устанавливает
координаты виртуальных view на экране. Может метод setBoundsInParent
устанавливает координаты относительно чего мы устанавливаем эти
координаты,т.е на какой точке экрана у нас будет точка с координатами 0,0?

Ответить   Wed, 22 Jul 2020 18:29:02 +0300 (#3655265)