[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. Заранее всем огромное
спасибо за помощь.
Приветствую всех!
В принципе, ваш код должен работать.
Подход верный -- переопределить 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);
}
};
Успехов. Анатолий.
Исходное сообщение > а у меня задача пока
[...]