Как исправить проблемы с видимостью фокуса фокуса 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:
Я думаю, что ответ на ваш вопрос там.