记录一下:Dialog中超链接跳转Google浏览器打开

本文介绍了一种在Android应用中创建包含可点击链接的自定义对话框的方法。通过使用SpannableString设置链接颜色和URLSpan实现点击跳转功能,并调整了对话框布局和TextView属性以增强用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public void showTestDialog() {
        String mvnoMessage = mContext.getString(R.string.test1);
        String http = "http://baidu.com;
        String[] messages = mvnoMessage.split(http);
        SpannableStringBuilder mvnoSpannableStringBuilder = new SpannableStringBuilder();
        mvnoSpannableStringBuilder.append(messages[0]);
        SpannableString mvnoSpan = new SpannableString(http);
        mvnoSpan.setSpan(new ForegroundColorSpan(Color.GREEN),0,http.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        mvnoSpan.setSpan(new URLSpan(http),0,http.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        mvnoSpannableStringBuilder.append(mvnoSpan);
        mvnoSpannableStringBuilder.append(messages[1]);
        final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
        builder.setTitle(R.string.test2);
        builder.setMessage(mvnoSpannableStringBuilder);
        builder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        builder.setCancelable(true);

        final AlertDialog dialog = builder.create();
        dialog.setCanceledOnTouchOutside(false);
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        dialog.show();
        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
        layoutParams.copyFrom(dialog.getWindow().getAttributes());
        layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        dialog.getWindow().setAttributes(layoutParams);
        TextView messageView = (TextView)dialog.getWindow().getDecorView().findViewById(android.R.id.message);
        messageView.setText(mvnoSpannableStringBuilder);
        messageView.setMovementMethod(LinkMovementMethod.getInstance());
        CharSequence text = messageView.getText();
        if(text instanceof Spannable){
            int end = text.length();
            Spannable sp = (Spannable)messageView.getText();
            URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
            SpannableStringBuilder style=new SpannableStringBuilder(text);
            style.clearSpans();//should clear old spans
            for(URLSpan url : urls){
                MyURLSpan myURLSpan = new MyURLSpan(url.getURL(),mContext,dialog);
                style.setSpan(myURLSpan,sp.getSpanStart(url),sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            messageView.setText(style);
        }
    }
    private static class MyURLSpan extends ClickableSpan{
        public String TAG = "MyURLSpan";
        private String mUrl;
        private Context mContext;
        private Dialog mDialog;
        MyURLSpan(String url,Context context,Dialog dialog) {
            mUrl =url;
            mContext = context;
            mDialog = dialog;
        }
        @Override
        public void onClick(View widget) {
            // TODO Auto-generated method stub
            Log.d(TAG, "onClick: MyURLSpan mUrl"+mUrl);
            if(mDialog != null && mDialog.isShowing()){
                mDialog.dismiss();
            }
//            com.android.chrome/com.google.android.apps.chrome.IntentDispatcher
            Intent urlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(mUrl));
            urlIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            urlIntent.setClassName("com.android.chrome", "com.google.android.apps.chrome.IntentDispatcher");
            mContext.startActivity(urlIntent);

        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值