передать значение в string.xml, в котором есть ссылка - PullRequest
0 голосов
/ 03 января 2019

У меня есть это значение в файле string.xml:

<string name="rights">Copyright © All Rights Reserved %1$d <b> <a href="http://www.example.com/">company name</a></b></string>

И я применил этот код, который передает вышеуказанный текст, и установил для этого текста значение TextView

private void setupAppInfoRights() {

    int currentYear = Calendar.getInstance().get(Calendar.YEAR);
    String rights = String.format(new Locale("en"), getString(R.string.rights), currentYear);
    appInfoRights.setText(rights);
    appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());

}

Когда я удаляю переданное значение, все идет хорошо, и когда пользователь нажимает на название компании, оно переходит на веб-сайт компании.

Обратите внимание, что я пробовал автоссылку в xml, когда не было передано значение, но оно не работает должным образом.

Но когда я добавляю переданное значение и использовал код, указанный выше, название компании не имеет подчеркивания, и когда пользователь щелкает его, оно ничего не делает.

Как отредактировать мой код выше, чтобы пропустить текущий год и сохранить нормальное поведение ссылки?

Примечание: Я использовал String.format для отображения текущего года в виде английского номера всегда, несмотря на другие номера локали.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Если у вас есть строковый ресурс с аргументами формата (например, %1$d) и HTML-разметкой, вы должны использовать многошаговый процесс для создания стиля CharSequence. Эта дополнительная работа необходима, потому что и Resources.getString(int, Object...), и String.format(String, Object...) могут возвращать только String экземпляров, но не другие подклассы CharSequence, способные хранить информацию о стилях.

Сначала измените ваш строковый ресурс, чтобы использовать html-сущности для экранирования html-тегов:

<string name="rights">Copyright © All Rights Reserved %1$d &lt;b> &lt;a href="http://www.example.com/">company name&lt;/a>&lt;/b></string>

Затем получите String с аргументами формата, замененными фактическими значениями, которые вы хотите:

String withHtmlMarkup = getString(R.string.rights, currentYear);

Наконец, используйте Html.fromHtml() для разбора html-разметки:

CharSequence styled = Html.fromHtml(withHtmlMarkup);

Затем вы можете установить этот styled текст для вашего TextView как обычно:

appInfoRights.setText(styled);
appInfoRights.setMovementMethod(LinkMovementMethod.getInstance());

Руководство разработчика: https://developer.android.com/guide/topics/resources/string-resource#FormattingAndStyling

Обычно это не работает, потому что методы format(String, Object...) и getString(int, Object...) удаляют всю информацию о стиле из строки. Обходным путем является написание HTML-тегов с экранированными сущностями, которые затем восстанавливаются с помощью fromHtml(String) после форматирования.

0 голосов
/ 03 января 2019

Я думаю, SpannableStringBuilder - это то, что вы ищете.

  TextView linkTv = (TextView) findViewById(R.id.link_tv);
  linkTv.setMovementMethod(LinkMovementMethod.getInstance());
  Spannable span = (Spannable) linkTv.getText();
  ClickableSpan clickableSpan = new ClickableSpan() {
     @Override
     public void onClick(View widget){
        //open the link
     }
  };
span.setSpan(clickableSpan, 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
 //for bold
span.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), 0, span.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

Если вы хотите сделать кликабельной только определенную часть, переключите значения 0 и span.length() в setSpan().

...