如何使MaterialAlertDialogBu​​ilder中的ClickableSpan链接可点击?

时间:2020-05-24 08:04:35

标签: android android-alertdialog material-components spannablestringbuilder clickablespan

我有一个SpannableStringBuilder对象,它带有一个ClickableSpan链接,

SpannableStringBuilder ssb = new SpannableStringBuilder("Hi StackOverflow!");

ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        Toast.makeText(MainActivity.this, "Clicked", Toast.LENGTH_SHORT).show();
    }
};

ssb.setSpan(clickableSpan, 3, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

当我将其设置为TextView并使用textView.setMovementMethod(LinkMovementMethod.getInstance())后,此方法正常工作

当我将ssb对象设置为MaterialAlertDialogBuilder时,

new MaterialAlertDialogBuilder(this)
                .setTitle("My Dialog")
                .setMessage(ssb)
                .show();

它显示为可单击的链接,但实际上无法单击它 MaterialAlertDialogBuilder preview 我找不到在setMovementMethod中对消息使用MaterialAlertDialogBuilder的方法。有什么办法可以使其点击?

3 个答案:

答案 0 :(得分:3)

以下代码段可让您点击可扩展内容,请尝试一下。

SpannableString s = new SpannableString(msg); // Here msg should have url to enable clicking
Linkify.addLinks(s, Linkify.ALL);

之后,将您的警报对话框代码放在此处

//Alert dialog code

然后获取MaterialAlertDialog的textview的ID,必须在dialog.show()之后调用以下代码行,

((TextView)dialog.findViewById(android.R.id.message))
.setMovementMethod(LinkMovementMethod.getInstance());

答案 1 :(得分:3)

只需使用TextView提供的默认样式( @style/MaterialAlertDialog.MaterialComponents.Body.Text )定义一个MaterialAlertDialogBuilder

<TextView
  android:id="@+id/textview1"
  style="?attr/materialAlertDialogBodyTextStyle"
  ...>

然后将SpannableStringBuilder设置为文本:

SpannableStringBuilder ssb =....
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.custom_text_view, null);
TextView customTextView = dialogView.findViewById(R.id.textview1);
customTextView.setText(ssb);
customTextView.setMovementMethod(LinkMovementMethod.getInstance());

最后:

 MaterialAlertDialogBuilder(this)
        .setTitle("My Dialog")
        .setView(dialogView)
        ...

答案 2 :(得分:2)

我想知道如何通过包含 简单 html标签的静态字符串向MaterialAlertDialog消息添加超链接,而不必创建自定义视图(例如Hello <a href='https://en.wikipedia.org/wiki/%22Hello,_World!%22_program'> World </a>),@Bhavnik's的答案很有帮助:

val dialog = MaterialAlertDialogBuilder(context)
                    .setTitle(getString(R.string.dialog_title))
                    .setMessage(getText(R.string.dialog_content))
                    ...
                    .show()
dialog.findViewById<TextView>(android.R.id.message)?.movementMethod = LinkMovementMethod.getInstance()

主要技巧确实是在显示对话框之后添加LinkMovementMethod,但也不要忘记使用getText来获取字符串以保持样式。

对于更复杂的html,.setMessage(Html.fromHtml(getText(R.string.dialog_content).toString(), flags))似乎也可以使用。