Сделать гиперссылку интерактивной при включенной доступности

#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." />
  

Контекстное меню обратной связи со списком ссылок TextView для активации

Ответ №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>
  

Ссылка, а также образец Java