我怎样才能得到一个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风格的可点击的超链接:
- 将内容设置为View,而不是使用
setMessage(…)
,因为只有Views允许可点击的HTML内容 - 设置正确的移动方法(
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)