#android #android-accessibility
#Android #Специальные возможности
Вопрос:
Я делаю приложение доступным с помощью специальных возможностей с помощью разговора / озвучки.
Как сделать ссылки интерактивными с помощью доступности?
Для создания Hyperlink
интерактивной ссылки используйте следующие методы TextView
.
/**
* This method creates the link and associates the ClickableSpan to it.
* Once the ClickableSpan is clicked, it will call the
* ClickableSpanListener.performAction
*/
public static void makeLinkClickable(
final ClickableSpanListener clickableSpanListener,
final SpannableStringBuilder strBuilder,
final URLSpan span) {
final int start = strBuilder.getSpanStart(span);
final int end = strBuilder.getSpanEnd(span);
final int flags = strBuilder.getSpanFlags(span);
//get the String that is used as the link
final char[] characters = new char[end - start];
strBuilder.getChars(start, end, characters, 0);
final ClickableSpan clickable = new ClickableSpan() {
public void onClick(final View view) {
clickableSpanListener.performAction(span.getURL(), new String(characters));
}
};
strBuilder.setSpan(clickable, start, end, flags);
strBuilder.removeSpan(span);
}
/**
* This method takes in a String that contains at least one link defined by HTML <a></a> tags.
* A link will be created in the String and added to the TextView.
* The link will become clickable and the action (onClick) is defined by the
* ClickableSpanListener.
*/
public static void setTextViewHTML(
final ClickableSpanListener clickableSpanListener,
final TextView text,
final String html) {
final CharSequence sequence = Html.fromHtml(html);
final SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
final URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
for (final URLSpan span : urls) {
makeLinkClickable(clickableSpanListener, strBuilder, span);
}
text.setText(strBuilder);
text.setMovementMethod(LinkMovementMethod.getInstance());
}
/**
* This is the interface that should be implemented by classes to define the action
* that will occur when a clickablespan is clicked
*/
public interface ClickableSpanListener {
void performAction(String url, String linkText);
}
setTextViewHTML(
this,
txtTermsPrivacy,
getString(R.string.terms_condition_privacy_policy)
);
Пробовал:
Как упоминалось в разделе поддержки Google для специальных возможностей Google Support — Accessibility, я пытался использовать Linkify, но, похоже, это не работает.
Комментарии:
1. Как вы решили проблему?
Ответ №1:
Как упоминалось на странице поддержки Google, пользователю необходимо будет получить доступ к Local Context Menu
с помощью TalkBack
жеста (жест по умолчанию Swipe up then right
), чтобы активировать TextView
ссылку.
Фактически, любой клик span
на TextView
виджете может быть активирован TalkBack
с помощью его контекстного меню, даже ссылки, которые не открываются в браузере. Ваша реализация performAction
может отображать Toast
сообщение, и пользователь сможет активировать его через контекстное меню.
Я протестировал это с TalkBack 7.3.0
Android 8.1
помощью с Linkify
помощью и android:autoLink="web"
. Оба работают должным образом.
<TextView
android:id="@ id/myTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:text="This is a TextView with link to StackOverflow: http://www.stackoverflow.com, and to Android Documentation: https://developer.android.com." />
Ответ №2:
val clickSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
// Handel your click
Util.launchUrl(activity, getString(R.string.permissions_request_agreement_url))
}
}
val agreementLabel = getString(R.string.permissions_request_agreement_label)
val textHeadingSpannable: SpannableString = SpannableString(agreementLabel)
//From "I agree to the Optus Privacy Policy", make "Optus Privacy Policy" clickable
textHeadingSpannable.setSpan(clickSpan, 15, agreementLabel.length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE)
privacyLink.text = textHeadingSpannable
privacyLink.movementMethod = LinkMovementMethod.getInstance()
listener = ValidatedListener {
btnPrimary.isEnabled = isValidated()
}
С другой стороны:
<string name="permissions_request_agreement_label">I agree to the Optus Privacy Policy</string>
<string name="permissions_request_agreement_url">https://www.optus.com.au/about/legal/privacy/telco-services</string>