Как я могу получить активируемые по щелчку гиперссылки в AlertDialog от строкового ресурса?

То, что я пытаюсь выполнить, должно иметь активируемые по щелчку гиперссылки в тексте сообщения, отображенном AlertDialog. В то время как AlertDialog реализация счастливо подчеркивает и окрашивает любые гиперссылки (определенное использование <a href="..."> в строковом ресурсе, переданном Builder.setMessage) предоставленный ссылки не становятся активируемыми по щелчку.

Код, который я в настоящее время использую, похож на это:

new AlertDialog.Builder(MainActivity.this).setTitle(
        R.string.Title_About).setMessage(
        getResources().getText(R.string.about))
        .setPositiveButton(android.R.string.ok, null)
        .setIcon(R.drawable.icon).show();

Я хотел бы избегать использования a WebView просто отобразить текстовый отрывок.

127
задан Willi Mentzel 20 January 2017 в 12:44
поделиться

6 ответов

Если вы показываете только какой-то текст и URL[ы] в вашем диалоге, возможно, решение проще

public static class MyOtherAlertDialog {

 public static AlertDialog create(Context context) {
  final TextView message = new TextView(context);
  // i.e.: R.string.dialog_message =>
            // "Test this dialog following the link to dtmilano.blogspot.com"
  final SpannableString s = 
               new SpannableString(context.getText(R.string.dialog_message));
  Linkify.addLinks(s, Linkify.WEB_URLS);
  message.setText(s);
  message.setMovementMethod(LinkMovementMethod.getInstance());

  return new AlertDialog.Builder(context)
   .setTitle(R.string.dialog_title)
   .setCancelable(true)
   .setIcon(android.R.drawable.ic_dialog_info)
   .setPositiveButton(R.string.dialog_action_dismiss, null)
   .setView(message)
   .create();
 }
}

Как показано здесь. http://picasaweb.google.com/lh/photo/up29wTQeK_zuz-LLvre9wQ?feat=directlink

Alert dialog with clickable links

124
ответ дан 24 November 2019 в 00:41
поделиться

JFTR, вот решение, которое я понял через некоторое время:

View view = View.inflate(MainActivity.this, R.layout.about, null);
TextView textView = (TextView) view.findViewById(R.id.message);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(R.string.Text_About);
new AlertDialog.Builder(MainActivity.this).setTitle(
        R.string.Title_About).setView(view)
        .setPositiveButton(android.R.string.ok, null)
        .setIcon(R.drawable.icon).show();

Соответствующий about.xml, заимствованный как фрагмент из источников Android, выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView" android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:paddingTop="2dip"
    android:paddingBottom="12dip" android:paddingLeft="14dip"
    android:paddingRight="10dip">
    <TextView android:id="@+id/message" style="?android:attr/textAppearanceMedium"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:padding="5dip" android:linksClickable="true" />
</ScrollView>

Важными частями являются установка linksClickable в true и setMovementMethod(LinkMovementMethod.getInstance()).

.
12
ответ дан 24 November 2019 в 00:41
поделиться

Я делаю это, указывая в XML-ресурсе поле предупреждения и загружая его. См., например, about.xml (см. идентификатор ABOUT_URL), который инстанцируется в конце ChandlerQE.java. Соответствующие части кода java:

LayoutInflater inflater = 
    (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = (View) inflater.inflate(R.layout.about, null);

new AlertDialog.Builder(ChandlerQE.this)
.setTitle(R.string.about)
.setView(view)
1
ответ дан 24 November 2019 в 00:41
поделиться

Я объединил некоторые из описанных выше вариантов, чтобы создать эту функцию, которая работает для меня. передать результат в метод SetView () построителя диалогов.

public ScrollView LinkifyText(String message) 
{
    ScrollView svMessage = new ScrollView(this); 
    TextView tvMessage = new TextView(this);

    SpannableString spanText = new SpannableString(message);

    Linkify.addLinks(spanText, Linkify.ALL);
    tvMessage.setText(spanText);
    tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

    svMessage.setPadding(14, 2, 10, 12);
    svMessage.addView(tvMessage);

    return svMessage;
}
2
ответ дан 24 November 2019 в 00:41
поделиться

Вместо ...

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setTitle(R.string.my_title);
dialogBuilder.setMessage(R.string.my_text);

... я теперь использую:

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setTitle(R.string.my_title);
TextView textView = new TextView(this);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(R.string.my_text);
dialogBuilder.setView(textView);
9
ответ дан 24 November 2019 в 00:41
поделиться

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

Вот решение, которое свяжет текст вашего диалогового окна без какого-либо иного изменения стиля текста:

    // Linkify the message
    final SpannableString s = new SpannableString(msg); // msg should have url to enable clicking
    Linkify.addLinks(s, Linkify.ALL);

    final AlertDialog d = new AlertDialog.Builder(activity)
        .setPositiveButton(android.R.string.ok, null)
        .setIcon(R.drawable.icon)
        .setMessage( s )
        .create();

    d.show();

    // Make the textview clickable. Must be called after show()
    ((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
201
ответ дан 24 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: