Как исправить проблемы с видимостью фокуса фокуса Html.fromHtml(в ICS и Honeycomb)?

Чтобы получить TextView для отображения (и ведения дружественных с) строк HTML, мой код выглядит примерно так:

// itemHtml is a String of HTML defined above

TextView itemContent = (TextView) findViewById(R.id.itemContent);
itemContent.setText(Html.fromHtml(itemHtml));
itemContent.setMovementMethod(LinkMovementMethod.getInstance());

Если строка Html имеет ссылку, TextView приводит к ссылкам, которые можно кликать и настраивать. Когда пользователь фокусируется на определенной ссылке (например, с помощью d-pad), текст ссылки изменяется некоторым существенным образом, чтобы показать, что фокус был получен.

Проблема заключается в том, что, когда я тестирую этот же шаблон с помощью устройств с d-пэдом с использованием сотовых (например, Google TV) или сэндвич-вкусов с мороженым Android, ссылка в тексте не показывает заметных признаков того, что ссылка имеет фокус.

Я знаю, что он фокусируется, потому что, когда вы нажимаете Enter, он выполняет указанное действие. Вы даже можете перемещаться между различными ссылками в тексте; вы просто угадали, какую ссылку вы сейчас используете, что приводит к очень плохому опыту пользователя.

Есть ли что-то, что я делаю неправильно? Есть ли способ исправить это или обойти это?

Ответы

Ответ 1

Изменить: после нескольких разрывов я, наконец, подумал, что нашел решение. Однако это решение работает только для Honeycomb. ICS до сих пор не решена!

Начиная с API 11, Android имеет новую настройку в TextViews для определения того, можно ли выбрать текст.

Вы можете установить его с помощью setTextIsSelectable(true) в TextView или определить его в макете XML android:textIsSelectable="true"

Вероятно, лучше всего определить его в XML, так что сохранение обратной совместимости приложения тривиально. Просто убедитесь, что вы нацеливаете версию >= 11, или вы, вероятно, получите сообщение об ошибке.

Ответ 2

Способ, которым работает HTML.fromHTML, заключается в создании "пролетов" с различными эффектами во всех символах строки. Одним из обходных путей для этого было бы использовать ClickableSpan в сочетании с другим символом CharacterStyles, чтобы раскрасить текст как интерактивный. Предыдущий диапазон позволит вам зарегистрировать обратный вызов, и этот обратный вызов может состоять в передаче намерения просмотреть URL-адрес (который откроет браузер).

Ответ 3

Списки состояния цвета текста для Honeycomb + могут не устанавливать сфокусированное состояние на другой цвет или переопределять цвет, который будет постоянным.

Проверьте цвета + стили в файле your_android_sdk_directory/android-14/data/res/

Установка текста в android: autoLink = "web" также может помочь?

Ответ 4

Лучший способ сделать это - добавить стили CSS в свой html. Я знаю, что Android поддерживает : hover selector. Таким образом, вы можете сделать что-то вроде этого:

String myLink = "<a href=\"http:\/\/google.com\">your link</a>"
Html.fromHtml(myLink);

и найдите способ включить в него данные CSS: (я не уверен, как, но я думаю, что это возможно)

a :hover {
   color: red;
}

UPDATE:

Я думаю, что ответ на ваш вопрос там.