मैं स्ट्रिंग संसाधन से AlertDialog में क्लिक करने योग्य हाइपरलिंक कैसे प्राप्त कर सकता हूं?


134

मैं जो पूरा करने की कोशिश कर रहा हूं, वह संदेश टेक्स्ट में क्लिक करने योग्य हाइपरलिंक है जो ए द्वारा प्रदर्शित है 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();

मैं WebViewकेवल पाठ स्निपेट प्रदर्शित करने के लिए ए का उपयोग करने से बचना चाहता हूं ।


नमस्ते! क्या आप वास्तव में घोषित परिणाम ("खुशी से रेखांकित और किसी भी हाइपरलिंक रंग") को पूरा करते हैं? क्या स्ट्रिंग मूल्य आप गुजर रहे हैं?
मैक्सिमम गोंटार

1
हां, कुंजी एक स्ट्रिंग संसाधन में प्रदर्शित होने के लिए संदेश है, जिसे Resources.getText (...) HTML.text.Spanned HTML स्वरूपण के संरक्षण के रूप में देता है। जैसे ही आप इसे एक स्ट्रिंग में परिवर्तित करते हैं, हालांकि, जादू गायब हो जाता है।
थिलो-एलेक्जेंडर जिंकेल

जवाबों:


128

यदि आप अपने संवाद में केवल कुछ पाठ और 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

क्लिक करने योग्य लिंक के साथ संवाद को सचेत करें


1
आप शायद एक लेआउट फ़ाइल बनाना चाहते हैं और इसे फुला सकते हैं और इसे दृश्य के रूप में उपयोग कर सकते हैं।
जेफरी ब्लाटमैन

5
आप डिफ़ॉल्ट रूप से उपयोग किए जाने वाले मैच के लिए टेक्स्ट व्यू की शैली कैसे सेट करेंगे?
एंड्रॉयड डेवलपर

3
फिर, मुझे त्रुटि हो रही हैCalling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
ViliusK

207

मुझे वास्तव में वर्तमान में सबसे लोकप्रिय उत्तर पसंद नहीं आया क्योंकि यह संवाद में संदेश के स्वरूपण को काफी बदल देता है।

यहाँ एक समाधान है जो पाठ स्टाइल को बदले बिना आपके संवाद पाठ को लिंक करेगा:

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

5
चीयर्स, मेरे लिए onCreateDialogएक के भीतर से काम किया DialogFragment। बस onStartदिए गए क्लिक करने योग्य कोड को सेट करना showथा जिसे डायलॉगफ्रैग्मेंट को आह्वान करने के लिए बुलाया गया था
PJL

5
ऐसा लगता है कि संपूर्ण TextView को केवल लिंक के विपरीत क्लिक करने योग्य बनाया जा सकता है ... इसके आसपास कोई भी तरीका?
कवि

1
मैं मानता हूं कि यह एक बेहतर विकल्प है क्योंकि मूल उत्तर संवाद को गड़बड़ कर रहा है।
21

1
FindViewById द्वारा लौटाए गए दृश्य को "Instof TextView" के साथ जांचा जाना चाहिए, क्योंकि इस बात की कोई गारंटी नहीं है कि कार्यान्वयन में बदलाव नहीं होगा।
डेनिस ग्लैडकी

6
जैसा कि कहीं और बताया गया है, यदि उपयोग किया जाता है, तो setMessage(R.string.something)स्पष्ट रूप से लिंक करना आवश्यक नहीं है। create()कॉल करने से पहले यह AlertDialog ऑब्जेक्ट के लिए भी आवश्यक नहीं है show()(इसे बिल्डर पर कॉल किया जा सकता है), और चूंकि show()डायलॉग ऑब्जेक्ट वापस करता है, इसलिए findViewById(android.R.id.message)इसे जंजीर किया जा सकता है। संदेश दृश्य में टेक्स्ट दृश्य नहीं है, और आपके पास संक्षिप्त फ़ॉर्म्युलेशन होने की स्थिति में यह सब एक कोशिश-कैच में लपेटें।
पियरे-ल्यूक पाऊर

50

यह <a href>टैग को हाइलाइट करने के लिए भी बनाना चाहिए । कृपया ध्यान दें कि मैंने अभी-अभी एम्बी के कोड में कुछ पंक्तियाँ जोड़ी हैं। तो उसे श्रेय

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

10
यदि आप स्ट्रिंग्स.xml में html का उपयोग करते हैं, तो आपको Html.fromHtml का उपयोग करने की आवश्यकता नहीं है। setMessage(R.string.cool_link)साथ काम करता है<string name="cool_link"><a href="http://www.google.com">Check this link out</a></string>
idbrii

2
यह सच है। जब आप दोनों तरीकों (Html.fromHtml और HTML टैग को स्ट्रिंग्स। Xml) में संयोजित करते हैं, तो यह सूचित नहीं होता है।
जाराबेक जाकुब

इसकी थोड़ी देर हो गई है और fromHtml को हटा दिया गया है, अब क्या?
मेनाशेह

तुम अब भी fromHtml उपयोग कर सकते हैं: developer.android.com/reference/android/text/... , पूर्णांक) बस का उपयोगHtml.fromHtml("string with links", Html.FROM_HTML_MODE_LEGACY)
BVB

2
setMovementMethod()यहाँ महत्वपूर्ण हिस्सा है, अन्यथा URL क्लिक करने योग्य नहीं होगा।
स्काइ

13

वास्तव में, यदि आप सभी विचारों से निपटने के बिना बस एक स्ट्रिंग का उपयोग करना चाहते हैं, तो सबसे तेज़ तरीका संदेश टेक्स्टव्यू खोजना है और इसे लिंक करना है:

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

12

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

Android स्रोतों से एक टुकड़े के रूप में उधार लिया गया लगभग .xml इस तरह दिखता है:

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

महत्वपूर्ण भाग लिंक की स्थापना कर रहे हैं सच और सेट के लिए उपयुक्त .Method (LinkMovementMethod.getInstance ())।


धन्यवाद, इसने मेरे लिए समस्या हल कर दी। मेरे मामले में, यह आवश्यक नहीं था setLinksClickable(true)(मुझे लगता है कि यह पहले से ही था), लेकिन setMovementMethod(...)सभी अंतर बना दिया।
लार्स

10

के बजाय ...

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

अरे, आपका सोल काम करता है। क्या आप जानते हैं कि लिंक पर क्लिक करते समय पूरा टेक्स्टव्यू क्यों चमकता है?
गोलंगो

यह डिफ़ॉल्ट की तरह स्क्रॉल नहीं करता है।
मेव कैट 2012

7

सबसे सरल तरीका:

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

6

ऊपर दिए गए सभी उत्तर html टैग को नहीं हटाएंगे, जैसे कि यदि दिए गए स्ट्रिंग में हैं, तो मैंने सभी टैग हटाने की कोशिश की, और यह मेरे लिए ठीक है

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

और custom_dialog जैसा होगा;

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

उपरोक्त कोड सभी HTML टैग को हटा देगा और उदाहरण के रूप में निर्दिष्ट एचटीएमएल फ़ॉर्मेटिंग टेक्स्ट में सक्षम अन्य URL पर क्लिक करें।


5

मैं वर्तमान उत्तरों से वास्तव में संतुष्ट नहीं था। दो चीजें हैं जो तब महत्वपूर्ण होती हैं, जब आप AlertDialog के साथ href शैली में क्लिक करने योग्य हाइपरलिंक चाहते हैं:

  1. सामग्री को दृश्य के रूप में सेट करें और साथ नहीं setMessage(…), केवल दृश्य क्लिक करने योग्य HTML सामग्री की अनुमति दें
  2. सही मूवमेंट विधि सेट करें ( setMovementMethod(…))

यहाँ एक काम कर रहे न्यूनतम उदाहरण है:

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

3

मैंने कई सवाल और जवाब की जाँच की है, लेकिन यह काम नहीं करता है। मैंने ख़ुद किया था। यह 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());

    ....
}

इस टैग को 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>

2

मैंने इस फ़ंक्शन के साथ आने के लिए ऊपर चर्चा किए गए कुछ विकल्पों को संयोजित किया जो मेरे लिए काम करते हैं। डायलॉग बिल्डर के सेट व्यू () विधि के परिणाम को पास करें।

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

यदि आप एक का उपयोग कर रहे हैं DialogFragment, तो इस समाधान में मदद करनी चाहिए।

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

यदि आप SpannableString को संवाद के संदेश के रूप में सेट करते हैं, तो लिंक हाइलाइट किया गया है, लेकिन क्लिक करने योग्य नहीं है।
bk138

@ bk138 ऑनस्टार्ट () में .setMovementMethod () को कॉल करता है जो लिंक को क्लिक करने योग्य बनाता है।
tronman

2

मेरे लिए गोपनीयता नीति संवाद बनाने का सबसे अच्छा समाधान है:

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

वर्किंग उदाहरण की जाँच करें: ऐप लिंक


1

मैं XML संसाधन में चेतावनी बॉक्स को निर्दिष्ट करके और इसे लोड करके ऐसा करता हूं। उदाहरण के लिए देखें about.xml (ABOUT_URL आईडी देखें) कि के अंत के पास instantiated हो जाता है ChandlerQE.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

यह मेरा समाधान है। यह HTML टैग्स के बिना एक सामान्य लिंक बनाता है और बिना किसी URL के दिखाई देता है। इससे डिजाइन भी बरकरार रहता है।

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

1
धन्यवाद, बस सेटपैन जोड़ने के लिए (URL, startPoint, endPoint, Spanned.SPAN_EXCLUSIVE_EXCLUSS)। यहां startPoint और एंडपॉइंट ऐसे शब्द हैं, जिन्हें क्लिक करने के लिए हाइलाइट किया जाएगा
मनीष

0

सबसे आसान और छोटा रास्ता इस तरह है

संवाद में Android लिंक

((TextView) new AlertDialog.Builder(this)
.setTitle("Info")
.setIcon(android.R.drawable.ic_dialog_info)
.setMessage(Html.fromHtml("<p>Sample text, <a href=\"http://google.nl\">hyperlink</a>.</p>"))
.show()
// Need to be called after show(), in order to generate hyperlinks
.findViewById(android.R.id.message))
.setMovementMethod(LinkMovementMethod.getInstance());

क्या आप मुझे बता सकते हैं कि कोटलिन में यह कैसे करना है?
थॉमस विलियम्स

मुझे क्षमा करें। मुझे पता नहीं है कि कोटलिन
जेवियर कास्टेलानोस क्रूज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.