当前位置:  开发笔记 > 编程语言 > 正文

如何从字符串资源中获取AlertDialog中的可点击超链接?

如何解决《如何从字符串资源中获取AlertDialog中的可点击超链接?》经验,为你挑选了9个好方法。

我想要完成的是在一个显示的消息文本中有可点击的超链接AlertDialog.虽然AlertDialog实现愉快地强调并着色任何超链接(在传递给的字符串资源中定义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> emmby..:

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

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

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


干杯,在`onCreateDialog`中为'DialogFragment`工作.只需在`onStart`上设置可点击代码,因为已经调用了`show`来调用DialogFragment
这似乎使整个TextView可点击而不仅仅是链接......任何方式都可以吗?
正如其他地方所指出的,如果使用`setMessage(R.string.something)`,则没有必要明确地进行链接.在调用`show()`(它可以在Builder上调用)之前也没有必要"创建()`AlertDialog对象,并且因为`show()`返回对话框对象,`findViewById(android.R) .id.message)`可以链接.将它全部包装在try-catch中以防万一消息视图不是TextView,并且您有一个简洁的公式.

2> Diego Torres..:

如果您只是在对话框中显示一些文本和URL [s],则解决方案可能更简单

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

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


如何设置textView的样式以匹配默认使用的样式?
然后,我收到错误`从Activity上下文调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志.这真的是你想要的吗?`

3> DeRagan..:

这应该使标签也被突出显示.请注意,我刚刚为emmby的代码添加了几行代码.所以归功于他

final AlertDialog d = new AlertDialog.Builder(this)
 .setPositiveButton(android.R.string.ok, null)
 .setIcon(R.drawable.icon)
 .setMessage(Html.fromHtml("Check this link out"))
 .create();
d.show();
// Make the textview clickable. Must be called after show()   
    ((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());


如果在strings.xml中使用html,则不需要使用Html.fromHtml.`setMessage(R.string.cool_link)`适用于` 检查此链接 `
那是真实的.当你将两种方法(Html.fromHtml和strings.xml中的HTML标签)组合在一起时,它不起作用.

4> vinc3m1..:

实际上,如果您只想在不处理所有视图的情况下使用字符串,最快的方法是查找消息textview并将其链接:

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



5> Thilo-Alexan..:

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源代码片段借用的相应about.xml如下所示:



    

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



6> neu242..:

代替 ...

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



7> Lakshmanan..:

以上所有答案都不会删除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("Hello World This is a test of the URL  Example

This text is bold

This text is emphasized

This is computer output

This is subscript and superscript

";)); builder.setView(layout); AlertDialog alert = builder.show();

和custom_dialog会是这样的;




    

上面的代码将删除所有的html标记,并在指定的html格式文本中显示Example as Click able URL.



8> Flow..:

我对目前的答案并不满意.当你想要一个带有AlertDialog的href样式的可点击超链接时,有两件事是很重要的:

    将内容设置为View而不是setMessage(…),因为只有Views允许可点击的HTML内容

    设置正确的移动方法(setMovementMethod(…))

这是一个有用的最小例子:

strings.xml中


    Cool Links:\n
    Stackoverflow\n
    Android Enthusiasts\n

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



9> 小智..:

最简单的方法:

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

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有