如何使 MaterialAlertDialogBuilder 中的 ClickableSpan 链接可点击?
How to make ClickableSpan links in MaterialAlertDialogBuilder clickable?
我有一个带有 ClickableSpan
link 的 SpannableStringBuilder
对象,
SpannableStringBuilder ssb = new SpannableStringBuilder("Hi Whosebug!");
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();
它显示为可点击的 link 但实际上无法点击它
我找不到将 setMovementMethod
用于 MaterialAlertDialogBuilder
中消息的方法。有什么办法让它可以点击吗?
这是使您的可点击内容可点击的代码片段,试一试。
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());
只需使用 MaterialAlertDialogBuilder
:
提供的默认样式 (@style/MaterialAlertDialog.MaterialComponents.Body.Text
) 定义一个 TextView
<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)
...
我想知道如何通过包含 simple html 标签而无需创建自定义视图(例如 Hello <a href='https://en.wikipedia.org/wiki/%22Hello,_World!%22_program'> World </a>
), 答案帮助很大:
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))
似乎也有效。
我有一个带有 ClickableSpan
link 的 SpannableStringBuilder
对象,
SpannableStringBuilder ssb = new SpannableStringBuilder("Hi Whosebug!");
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();
它显示为可点击的 link 但实际上无法点击它
setMovementMethod
用于 MaterialAlertDialogBuilder
中消息的方法。有什么办法让它可以点击吗?
这是使您的可点击内容可点击的代码片段,试一试。
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());
只需使用 MaterialAlertDialogBuilder
:
@style/MaterialAlertDialog.MaterialComponents.Body.Text
) 定义一个 TextView
<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)
...
我想知道如何通过包含 simple html 标签而无需创建自定义视图(例如 Hello <a href='https://en.wikipedia.org/wiki/%22Hello,_World!%22_program'> World </a>
),
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))
似乎也有效。