我怎样才能得到一个string资源AlertDialog中的可点击的超链接?

我试图完成的是在AlertDialog显示的消息文本中有可点击的超链接。 虽然AlertDialog实现愉快地强调和AlertDialog超链接(使用传递给Builder.setMessage的string资源中的<a href="...">定义),但链接不会变成可点击的。

我目前使用的代码如下所示:

 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来显示文本片段。

如果您只是在对话框中显示一些文本和URL,那么解决scheme可能更简单

 public static class MyOtherAlertDialog { public static AlertDialog create(Context context) { final TextView message = new TextView(context); // ie: 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

带有可点击链接的警报对话框

我不太喜欢当前最stream行的答案,因为它显着改变了对话框中消息的格式。

这是一个解决scheme,将链接您的对话框文本,而不会改变文本样式:

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

这应该使<a href>标签也被突出显示。 请注意,我刚刚添加了几行emmby的代码。 所以信用他

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

其实,如果你想简单地使用一个string而不处理所有的视图,最快的方法是find消息textview并链接它:

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

JFTR,这里来了一段时间后我想到的解决scheme:

 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源代码中借用的相应的about.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> 

重要的部分是将linksClickable设置为true和setMovementMethod(LinkMovementMethod.getInstance())。

代替 …

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

所有上面的答案不会删除像标签,如果给定的string包含,我试图删除所有的标签,这对我来说工作正常

 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标签,并在指定的html格式文本中显示所有其他的可点击URL的示例。

我对目前的答案并不满意。 有两个重要的事情,当你想要一个AlertDialog href风格的可点击的超链接:

  1. 将内容设置为View,而不是使用setMessage(…) ,因为只有Views允许可点击的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() } … 

我已经检查了许多问题和答案,但它不起作用。 我自己做的。 这是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> 

最简单的方法:

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

我结合了上面讨论的一些选项,想出了适合我的这个function。 将结果传递给对话框构build器的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; } 

如果您使用的是DialogFragment ,则此解决scheme应该有所帮助。

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

我这样做是通过在XML资源中指定警报框并加载它。 请参阅例如在ChandlerQE.java结尾处实例化的about.xml (请参阅ABOUT_URL id)。 来自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)