警报对话框中的可单击文本链接以打开活动

Posted

技术标签:

【中文标题】警报对话框中的可单击文本链接以打开活动【英文标题】:Clickable text link in Alert Dialog to open Activity 【发布时间】:2020-08-06 03:27:41 【问题描述】:

我希望警报对话框中的一个单词可以点击并在点击时打开一个活动。

我尝试在 SpannableString 中使用 ClickableSpan,但点击根本无法识别...

public class TestDialog extends AppCompatDialogFragment 

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        String text = "This is a test message.";

        SpannableString ss = new SpannableString(text);

        ClickableSpan cs = new ClickableSpan() 
            @Override
            public void onClick(@NonNull View view) 
                System.out.println("Test");
            
        ;

        ss.setSpan(cs, 10, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(ss)
                .setTitle("Test Title")
                .setPositiveButton("Ok!", new DialogInterface.OnClickListener() 
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) 
                        // do something
                    
                )
                .setNegativeButton("No!", new DialogInterface.OnClickListener() 
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) 
                        // do something
                    
                );

        return builder.create();
    

感谢您的帮助!

【问题讨论】:

【参考方案1】:

好的,我在这里的其他几篇帖子和 youtube 视频的帮助下做到了。 我使用自定义布局来显示文本和可点击的跨度,然后我会在警报对话框中显示:

public class TestDialog extends AppCompatDialogFragment 
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        String text = "This is a test message.";

        SpannableString ss = new SpannableString(text);

        ClickableSpan cs = new ClickableSpan() 
            @Override
            public void onClick(@NonNull View view) 
                Intent testIntent = new Intent(getContext(), Test.class);
                getContext().startActivity(testIntent);
            
        ;

        ss.setSpan(cs, 10, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.test_view, null);

        TextView message = (TextView) view.findViewById(R.id.textView);
        message.setMovementMethod(LinkMovementMethod.getInstance());
        message.setText(ss);

        builder.setView(view)
                .setTitle("Test Title")
                .setPositiveButton("Ok!", new DialogInterface.OnClickListener() 
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) 
                        // do something
                    
                )
                .setNegativeButton("No!", new DialogInterface.OnClickListener() 
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) 
                        // do something
                    
                );

        return builder.create();
    

希望我也能帮到你。

【讨论】:

【参考方案2】:

首先,使用html.fromHtml 使您的文本 HTML 链接可点击:

.setMessage(Html.fromHtml(text))

并且,将此行添加到清单中的 Activity:

<data android:host="my.app" android:scheme="http"></data>

然后,http://my.app 应该启动您的活动。

【讨论】:

我试过了,但它只是显示为纯文本。我也点不了。有没有办法用 ClickableSpans 做到这一点?

以上是关于警报对话框中的可单击文本链接以打开活动的主要内容,如果未能解决你的问题,请参考以下文章

通过单击通知下拉菜单中的选项卡打开(警报)对话框

通过单击活动中的任意位置找出对话框何时关闭

单击列表视图时如何显示警报对话框

单击列表视图时如何显示警报对话框

在导航到下一个片段时在底部导航视图中打开警报对话框

使用对话框中的状态按钮或 Material UI 中的警报来反应内存泄漏警告