স্ট্রিং রিসোর্স থেকে আমি কীভাবে এলার্টডায়ালগ-এ ক্লিকযোগ্য হাইপারলিঙ্কগুলি পেতে পারি?


134

আমি যেটি সম্পাদন করার চেষ্টা করছি তা হ'ল একটি দ্বারা প্রদর্শিত বার্তার পাঠ্যে ক্লিকযোগ্য হাইপারলিংক AlertDialog। যদিও AlertDialogবাস্তবায়ন সুখে underlines এবং রং কোন হাইপারলিঙ্ক (ব্যবহার নির্ধারণ করা <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
হ্যাঁ, কীটি বার্তাটি স্ট্রিং রিসোর্সে প্রদর্শিত হতে হবে যা রিসোর্স.জেটটেক্সট (...) একটি Android.text হিসাবে প্রত্যাবর্তন করে the এইচটিএমএল ফর্ম্যাট সংরক্ষণ করে। যত তাড়াতাড়ি আপনি এটিকে একটি স্ট্রিংয়ে রূপান্তর করেন তবে যাদুটি নিখোঁজ হয়।
থিলো-আলেকজান্ডার জিনকেল

উত্তর:


128

আপনি যদি আপনার কথোপকথনে কেবল কিছু পাঠ্য এবং ইউআরএল [গুলি] দেখান তবে সমাধানটি সহজ

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?
পাচ্ছি

206

আমি বর্তমানে সর্বাধিক জনপ্রিয় উত্তরটি পছন্দ করি নি কারণ এটি ডায়ালগের বার্তার বিন্যাসে উল্লেখযোগ্যভাবে পরিবর্তন করে।

এখানে এমন একটি সমাধান রয়েছে যা অন্যথায় পাঠ্যের স্টাইলিংটি পরিবর্তন না করেই আপনার কথোপকথনের পাঠকে লিঙ্কযুক্ত করবে:

    // 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
চিয়ার্স, ভিতর থেকে আমার জন্য কাজ onCreateDialogA -এর DialogFragment। শুধু এ ক্লিক করার যোগ্য কোড সেট করতে হয়েছে onStartযে দেওয়া showDialogFragment ডাকা ডেকে হয়েছে
PJL

5
এটি কেবল লিঙ্কগুলির বিপরীতে পুরো টেক্সটভিউকে ক্লিকযোগ্য করে তুলবে বলে মনে হচ্ছে ... এটি কোনও উপায়ে?
কাবি

1
আমি সম্মত হলাম এটি একটি আরও ভাল বিকল্প, কারণ মূল উত্তরটি ডায়ালগটি দৃষ্টিভঙ্গিতে জড়িয়ে ফেলছে।
এইচসিপিএল

1
FindViewById দ্বারা ফিরে আসা ভিউটি "উদাহরণস্বরূপ টেক্সটভিউ" দিয়ে পরীক্ষা করা উচিত, কারণ বাস্তবায়ন পরিবর্তন হবে না এমন কোনও গ্যারান্টি নেই।
ডেনিস গ্ল্যাডকি

6
অন্য কোথাও নির্দেশিত হিসাবে, যদি ব্যবহার করা হয় setMessage(R.string.something), তবে স্পষ্টভাবে লিঙ্কযুক্ত করা প্রয়োজন হয় না। create()কল করার আগে সতর্কতা ডায়ালগ অবজেক্টেরও এটি প্রয়োজন হয় না show()(এটি বিল্ডারে ডাকা যেতে পারে) এবং যেহেতু show()ডায়ালগের বস্তুটি ফেরত দেয়, তাই findViewById(android.R.id.message)শৃঙ্খলিত হতে পারে। মেসেজ ভিউটি যদি কোনও টেক্সটভিউ না হয় এবং আপনার একটি সংক্ষিপ্ত গঠন তৈরি হয় কেবল তখনই এগুলি সমস্ত কিছু চেষ্টা-ক্যাপচারে আবদ্ধ করুন।
পিয়েরে-লুক পাওর

50

এটি <a href>হাইলাইট করার জন্য ট্যাগগুলি তৈরি করা উচিত । দয়া করে মনে রাখবেন যে আমি সবেমাত্র এমএমবির কোডে কয়েকটি লাইন যুক্ত করেছি। তাই তাকে creditণ

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
আপনি যদি স্ট্রিং.এক্সএমএলতে এইচটিএমএল ব্যবহার করেন তবে আপনার Html.fromHtml ব্যবহার করার দরকার নেই। setMessage(R.string.cool_link)সাথে কাজ করে<string name="cool_link"><a href="http://www.google.com">Check this link out</a></string>
ইডব্রি

2
ঐটা সত্য. যখন আপনি উভয় পদ্ধতি একত্রিত করেন (Html.fromHtml এবং এইচটিএমএল ট্যাগ স্ট্রিংস.এক্সএমএল) তখন এটি কার্যকর হয় না।
জেরাকবাকাকুব

এটি কিছুক্ষণ হয়ে গেছে এবং থেকে এইচটিএমএল অবহেলা করা হয়েছে, এখন কী?
মেনেশেহ

আপনি এখনও এইচটিএমএল থেকে ব্যবহার করতে পারেন: বিকাশকারী / অ্যান্ড্রয়েড.com/references/android/text/… , int) সহজভাবে ব্যবহার করুনHtml.fromHtml("string with links", Html.FROM_HTML_MODE_LEGACY)
বিভিবি

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

জেএফটিআর, এখানে সমাধানটি এসেছে যা আমি কিছু সময়ের পরে বের করেছিলাম:

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

অ্যানড্রয়েড উত্স থেকে এক টুকরা হিসাবে ধার করা সম্পর্কিত .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>

গুরুত্বপূর্ণ অংশগুলি লিঙ্কগুলি ক্লিক করে সত্য এবং সেট-মোভমেন্টমেথডকে (LinkMovementMethod.getInstance ()) এ ক্লিক করে।


আপনাকে ধন্যবাদ, এটি আমার জন্য সমস্যার সমাধান করেছে। আমার ক্ষেত্রে এটির প্রয়োজন ছিল না setLinksClickable(true)(আমার ধারণা এটি ইতিমধ্যে ছিল) তবে setMovementMethod(...)সমস্ত পার্থক্য তৈরি করেছিল।
LarsH

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

উপরের সমস্ত উত্তর এইচটিএমএল ট্যাগ ইত্যাদি সরিয়ে ফেলবে না যদি প্রদত্ত স্ট্রিং থাকে তবে আমি সমস্ত ট্যাগ মুছে ফেলার চেষ্টা করেছি এবং এটি আমার পক্ষে ঠিক কাজ করে

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

এবং কাস্টম_ডায়ালগটি এমন হবে;

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

উপরের কোডটি সমস্ত এইচটিএমএল ট্যাগ সরিয়ে ফেলবে এবং উদাহরণ হিসাবে উল্লেখযোগ্য এইচটিএমএল ফর্ম্যাটিং পাঠ্যের সমস্ত অন্যান্যকে ক্লিক করুন সক্ষম URL হিসাবে দেখায়।


5

আমি বর্তমানের উত্তরগুলি নিয়ে সত্যই সন্তুষ্ট নই। একটি সতর্কতা ডায়ালগ সহ আপনি href শৈলীতে ক্লিকযোগ্য হাইপারলিংকগুলি চাইলে দুটি জিনিস গুরুত্বপূর্ণ:

  1. সামগ্রীটি দেখার হিসাবে এবং না হিসাবে সেট করুন setMessage(…), কেবলমাত্র ভিউগুলি ক্লিকযোগ্য এইচটিএমএল সামগ্রীকে অনুমতি দেয়
  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 মানসমূহ \ স্ট্রিং.এক্সএমএলে এই ট্যাগটি রাখুন

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

আপনি যদি স্প্যানিয়েবল স্ট্রিংটিকে ডায়ালগের বার্তা হিসাবে সেট করেন তবে লিঙ্কটি হাইলাইট করা হয়েছে, তবে ক্লিকযোগ্য নয়।
বিকে 138

@ bk138 onStart () এ .setMovementMethod () এ কলটি লিঙ্কটিকে ক্লিকযোগ্য করে তোলে।
ট্রোনম্যান

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

আমি এক্সএমএল রিসোর্সে সতর্কতা বাক্সটি নির্দিষ্ট করে এবং এটি লোড করে এটি করি। উদাহরণস্বরূপ দেখুন 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

এটা আমার সমাধান। এটি জড়িত এইচটিএমএল ট্যাগ ব্যতীত এবং কোনও ইউআরএল দৃশ্যমান ছাড়াই একটি সাধারণ লিঙ্ক তৈরি করে। এটি নকশাকে অটুট রাখে।

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
ধন্যবাদ, কেবল সেটস্প্যান যোগ করার জন্য (ইউআরএল, স্টার্টপয়েন্ট, শেষ পয়েন্ট, স্প্যানড। এখানে স্টার্টপয়েন্ট এবং শেষ পয়েন্ট হ'ল শব্দগুলি যা ক্লিক করার জন্য হাইলাইট করা হবে
মণীশ

0

সবচেয়ে সহজ এবং সংক্ষিপ্ততম উপায়টি এরকম

সংলাপে অ্যান্ড্রয়েড লিঙ্ক

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

কোটলিনে এটি কীভাবে করবেন তা আপনি আমাকে বলতে পারেন?
টমাস উইলিয়ামস

আমি দুঃখিত. আমি কোটলিনকে জানি না
জাভিয়ের ক্যাস্তেলানানোস ক্রুজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.