it-swarm.com.de

Wie kann ich in AlertDialog anklickbare Hyperlinks von einer String-Ressource erhalten?

Was ich zu erreichen versuche ist, dass anklickbare Hyperlinks im Nachrichtentext von einer AlertDialog angezeigt werden. Während die Implementierung von AlertDialog glücklich alle Hyperlinks (definiert mit <a href="..."> in der an Builder.setMessage übergebenen Zeichenfolgenressource) unterstreicht und farblich markiert, können die Links nicht anklickbar werden.

Der Code, den ich derzeit verwende, sieht folgendermaßen aus:

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();

Ich möchte vermeiden, eine WebView zu verwenden, um nur einen Textauszug anzuzeigen.

121

Wenn Sie nur Text und URLs in Ihrem Dialog anzeigen, ist die Lösung möglicherweise einfacher

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();
 }
}

Wie hier gezeigt http://picasaweb.google.com/lh/photo/up29wTQeK_zuz-LLvre9wQ?feat=directlink

Alert dialog with clickable links

121

Ich mochte die aktuell beliebteste Antwort nicht wirklich, weil sie die Formatierung der Nachricht im Dialog erheblich ändert.

Hier ist eine Lösung, mit der Sie Ihren Dialogtext verknüpfen können, ohne den Textstil ansonsten zu ändern:

    // Linkify the message
    final SpannableString s = new SpannableString(msg);
    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());
193
emmby

Dadurch sollten <a href>-Tags ebenfalls hervorgehoben werden. Bitte beachten Sie, dass ich Emmby's Code ein paar Zeilen hinzugefügt habe. so gut zu ihm

final AlertDialog d = new AlertDialog.Builder(this)
 .setPositiveButton(Android.R.string.ok, null)
 .setIcon(R.drawable.icon)
 .setMessage(Html.fromHtml("<a href=\"http://www.google.com\">Check this link out</a>"))
 .create();
d.show();
// Make the textview clickable. Must be called after show()   
    ((TextView)d.findViewById(Android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
42
DeRagan

Wenn Sie einfach eine Zeichenfolge verwenden möchten, ohne sich mit allen Ansichten zu befassen, können Sie die Textansicht der Nachricht am schnellsten finden und verknüpfen:

d.setMessage("Insert your cool string with links and stuff here");
Linkify.addLinks((TextView) d.findViewById(Android.R.id.message), Linkify.ALL);
13
vinc3m1

JFTR, hier kommt die Lösung, die ich nach einiger Zeit herausgefunden habe:

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();

Die entsprechende "about.xml", die als Fragment aus den Android-Quellen ausgeliehen wurde, sieht folgendermaßen aus:

<?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>

Die wichtigen Teile setzen linksClickable auf true und setMovementMethod (LinkMovementMethod.getInstance ()).

Anstatt ...

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

... benutze ich jetzt:

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);
8
neu242

Alle obigen Antworten werden HTML-Tags wie etc nicht entfernen. Wenn die angegebene Zeichenfolge enthält, habe ich versucht, alle Tags zu entfernen, und dies funktioniert für mich

AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
        builder.setTitle("Title");

        LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(LAYOUT_INFLATER_SERVICE);
        View layout = inflater.inflate(R.layout.custom_dialog, null);

        TextView text = (TextView) layout.findViewById(R.id.text);
        text.setMovementMethod(LinkMovementMethod.getInstance());
        text.setText(Html.fromHtml("<b>Hello World</b> This is a test of the URL <a href=http://www.example.com> Example</a><p><b>This text is bold</b></p><p><em>This text is emphasized</em></p><p><code>This is computer output</code></p><p>This is<sub> subscript</sub> and <sup>superscript</sup></p>";));
        builder.setView(layout);
AlertDialog alert = builder.show();

und der custom_dialog wäre wie;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:id="@+id/layout_root"
              Android:orientation="horizontal"
              Android:layout_width="fill_parent"
              Android:layout_height="fill_parent"
              Android:padding="10dp"
              >

    <TextView Android:id="@+id/text"
              Android:layout_width="wrap_content"
              Android:layout_height="fill_parent"
              Android:textColor="#FFF"
              />
</LinearLayout>

Der obige Code entfernt alle html-Tags und zeigt "Example as Click" für alle anderen im angegebenen HTML-Formatierungstext an.

6
Lakshmanan

Ich war mit den aktuellen Antworten nicht wirklich zufrieden. Es gibt zwei Dinge, die wichtig sind, wenn Sie mit einem AlertDialog anklickbare Hyperlinks im Href-Stil erstellen möchten:

  1. Legen Sie den Inhalt als Ansicht und nicht mit setMessage(…) fest, da nur Ansichten anklickbaren HTML-Inhalt zulassen
  2. Stellen Sie die richtige Bewegungsmethode ein (setMovementMethod(…))

Hier ist ein funktionierendes Minimalbeispiel:

strings.xml

<string name="dialogContent">
    Cool Links:\n
    <a href="http://stackoverflow.com">Stackoverflow</a>\n
    <a href="http://Android.stackexchange.com">Android Enthusiasts</a>\n
</string>

MyActivity.Java

…
public void showCoolLinks(View view) {
   final TextView textView = new TextView(this);
   textView.setText(R.string.dialogContent);
   textview.setMovementMethod(LinkMovementMethod.getInstance()); // this is important to make the links clickable
   final AlertDialog alertDialog = new AlertDialog.Builder(this)
       .setPositivebutton("OK", null)
       .setView(textView)
       .create();
   alertDialog.show()
}
…
5
Flow

Ich habe viele Fragen und Antworten geprüft, aber es funktioniert nicht. Ich habe es selbst gemacht. Dies ist der Code-Ausschnitt von MainActivity.Java.

private void skipToSplashActivity()
{

    final TextView textView = new TextView(this);
    final SpannableString str = new SpannableString(this.getText(R.string.dialog_message));

    textView.setText(str);
    textView.setMovementMethod(LinkMovementMethod.getInstance());

    ....
}

Setzen Sie dieses Tag in res\values ​​\ String.xml

<string name="dialog_message"><a href="http://www.nhk.or.jp/privacy/english/">NHK Policy on Protection of Personal Information</a></string>
3
Hiroto

Einfachste Möglichkeit:

final AlertDialog dlg = new AlertDialog.Builder(this)
                .setTitle(R.string.title)
                .setMessage(R.string.message)
                .setNeutralButton(R.string.close_button, null)
                .create();
        dlg.show();
        // Important! Android.R.id.message will be available ONLY AFTER show()
        ((TextView)dlg.findViewById(Android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
3
Gabriele

Wenn Sie eine DialogFragment verwenden, sollte diese Lösung hilfreich sein.

public class MyDialogFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // dialog_text contains "This is a http://test.org/"
        String msg = getResources().getString(R.string.dialog_text);
        SpannableString spanMsg = new SpannableString(msg);
        Linkify.addLinks(spanMsg, Linkify.ALL);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.dialog_title)
            .setMessage(spanMsg)
            .setPositiveButton(R.string.ok, null);
        return builder.create();
    }

    @Override
    public void onStart() {
        super.onStart();

        // Make the dialog's TextView clickable
        ((TextView)this.getDialog().findViewById(Android.R.id.message))
                .setMovementMethod(LinkMovementMethod.getInstance());
    }
}
2
tronman

Ich habe einige der oben genannten Optionen kombiniert, um mit dieser Funktion zu arbeiten, die für mich funktioniert. Übergeben Sie das Ergebnis an die SetView () - Methode des Dialog-Builders.

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
Alex

Ich mache das, indem ich das Alert-Feld in einer XML-Ressource spezifiziere und dieses lade. Siehe zum Beispiel die Datei about.xml (siehe ABOUT_URL-ID), die am Ende von ChandlerQE.Java instanziiert wird. Die relevanten Teile aus dem Java-Code:

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
Heikki Toivonen

Für mich ist die beste Lösung zum Erstellen eines Datenschutzrichtliniendialogs:

    private void showPrivacyDialog() {
    if (!PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(PRIVACY_DIALOG_SHOWN, false)) {

        String privacy_pol = "<a href='https://sites.google.com/view/aiqprivacypolicy/home'> Privacy Policy </a>";
        String toc = "<a href='https://sites.google.com/view/aiqprivacypolicy/home'> T&C </a>";
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setMessage(Html.fromHtml("By using this application, you agree to " + privacy_pol + " and " + toc + " of this application."))
                .setPositiveButton("ACCEPT", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putBoolean(PRIVACY_DIALOG_SHOWN, true).apply();
                    }
                })
                .setNegativeButton("DECLINE", null)
                .setCancelable(false)
                .create();

        dialog.show();
        TextView textView = dialog.findViewById(Android.R.id.message);
        textView.setLinksClickable(true);
        textView.setClickable(true);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

überprüfen Sie das Arbeitsbeispiel: App-Link

0
Prakash Sharma

Das ist meine Lösung. Es erstellt einen normalen Link ohne HTML-Tags und ohne sichtbare URL. Es hält auch das Design intakt.

SpannableString s = new SpannableString("This is my link.");
s.setSpan(new URLSpan("http://www.google.com"), 11, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

AlertDialog.Builder builder;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    builder = new AlertDialog.Builder(this, Android.R.style.Theme_Material_Dialog_Alert);
} else {
    builder = new AlertDialog.Builder(this);
}

final AlertDialog d = builder
        .setPositiveButton("CLOSE", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // Do nothing, just close
            }
        })
        .setNegativeButton("SHARE", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // Share the app
                share("Subject", "Text");
            }
        })
        .setIcon(R.drawable.photo_profile)
        .setMessage(s)
        .setTitle(R.string.about_title)
        .create();

d.show();

((TextView)d.findViewById(Android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
0
John T