当前位置: 首页 > 知识库问答 >
问题:

将文本视图格式化为链接

万涵亮
2023-03-14

我一直在使用android:autoLink来格式化链接等,但我需要使用android:onClick,所以在这种情况下我不能使用它。原因是我发现意外点击电话号码太容易了,所以我要用确认对话框拦截点击,然后打电话。

有没有一种简单的方法可以让我的文本视图中的电话号码看起来像一个普通的可点击链接?我翻遍了Android的源代码,但找不到任何特别的风格供我参考。


共有3个答案

邰建业
2023-03-14

Linkify是一个很好的类,它搜索复杂的模式,比如URL、电话号码等,并将它们转换为URLspan。我没有重写现有的正则表达式,而是扩展了URLSpan类,并创建了一个方法,只将电话URLSpan升级为带有确认对话框的自定义URLSpan。

首先是我的扩展URLSpan类ConfirmSpan:

class ConfirmSpan extends URLSpan {
    AlertDialog dialog;
    View mView;

    public ConfirmSpan(URLSpan span) {
        super(span.getURL());
    }

    @Override
    public void onClick(View widget) {
        mView = widget;

        if(dialog == null) {
            AlertDialog.Builder mBuilder = new AlertDialog.Builder(widget.getContext());
            mBuilder.setMessage("Do you want to call: " + getURL().substring(4) + "?");
            mBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            })
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    openURL();
                }
            });
            dialog = mBuilder.create();
        }
        dialog.show();
    }

    public void openURL() {
        super.onClick(mView);
    }
}

接下来介绍替换不同跨度类的方法:

private void swapSpans(TextView textView) {
    Spannable spannable = (Spannable) textView.getText();
    URLSpan[] spans = textView.getUrls();
    for(URLSpan span : spans) {
        if(span.getURL().toString().startsWith("tel:")) {
            spannable.setSpan(new ConfirmSpan(span), spannable.getSpanStart(span), spannable.getSpanEnd(span), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            spannable.removeSpan(span);
        }
    }
}

最后,您需要做的就是创建一个具有“自动链接”属性的文本视图:

android:autoLink="phone"

并记住调用swapSpans()方法。请理解我写这个是为了好玩,可能还有其他方法可以做到这一点,但我目前不知道它们。希望这有帮助!

胡志
2023-03-14
  • 你可以创建一个颜色。xml资源文件,包含哪些颜色。请看一下颜色
安坚诚
2023-03-14

这是最短的解决方案:

final CharSequence text = tv.getText();
final SpannableString spannableString = new SpannableString( text );
spannableString.setSpan(new URLSpan(""), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(spannableString, TextView.BufferType.SPANNABLE);

可悲的是,点击的效果并不表现为点击了真正的url链接,但你可以这样克服它:

    final CharSequence text = tv.getText();
    final SpannableString notClickedString = new SpannableString(text);
    notClickedString.setSpan(new URLSpan(""), 0, notClickedString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.setText(notClickedString, TextView.BufferType.SPANNABLE);
    final SpannableString clickedString = new SpannableString(notClickedString);
    clickedString.setSpan(new BackgroundColorSpan(Color.GRAY), 0, notClickedString.length(),
            Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    tv.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(final View v, final MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                tv.setText(clickedString);
                break;
            case MotionEvent.ACTION_UP:
                tv.setText(notClickedString, TextView.BufferType.SPANNABLE);
                v.performClick();
                break;
            case MotionEvent.ACTION_CANCEL:
                tv.setText(notClickedString, TextView.BufferType.SPANNABLE);
                break;
            }
            return true;
        }
    });

另一个解决方案是使用Html。fromHtml(…),其中的文本包含链接标记(“”)。

如果你想要另一个解决方案,请查看此帖子。

 类似资料:
  • 问题内容: 我正在创建一个HTML表,将在Excel中作为电子表格打开。我可以使用哪种HTML标记或CSS样式“讲述” Excel以将单元格的内容显示为文本? 问题答案: 您可以将格式应用于数字,文本,日期等的单元格。 请参阅我以前关于此的答案:HTML toExcel:如何告诉Excel将列视为数字? (已调整的代码段) 如果将CSS类添加到页面: 并在您的TD上拍那些课,行得通吗?

  • 主要内容:HTML 文本格式化,HTML 格式化标签,在线实例,HTML 文本格式化标签,HTML "计算机输出" 标签,HTML 引文 引用 及标签定义HTML 文本格式化 加粗文本 斜体文本 这是 下标 和 上标 HTML 格式化标签 HTML 使用标签 <b>("bold") 与 <i>("italic") 对输出的文本进行格式, 如:粗体 or 斜体 这些HTML标签被称为格式化标签(请查看底部完整标签参考手册)。 通常标签 <strong> 替换加粗标签 <b> 来使用, <em> 替

  • 主要内容:1. text-align,2. text-decoration,3. text-transform,4. text-indent,5. line-height,6. letter-spacing,7. word-spacing,8. text-shadow ,9. vertical-align,10. white-space,11. direction通过 CSS 中的文本属性您可以像操作 Word 文档那样定义网页中文本的字符间距、对齐方式、缩进等等,CSS 中常用的文本属性如下所

  • HTML 文本格式化 加粗文本 斜体文本 电脑自动输出 这是 下标 和 上标 HTML 格式化标签 HTML 使用标签 <b>("bold") 与 <i>("italic") 对输出的文本进行格式, 如:粗体 or 斜体 这些HTML标签被称为格式化标签(请查看底部完整标签参考手册)。 通常标签 <strong> 替换加粗标签 <b> 来使用, <em> 替换 <i>标签使用。 然而,这些标签的含

  • 在生成Excel文件时,是否可以在ColdFusion代码中指定此格式?

  • 我成功地将google文档文件发送到google sheets中,电子表格能够正确填写(它将文本格式化为表格,非常整洁) 下面是我如何格式化文本的示例: (请注意,有两个空表,一个是“ID,PRICE,STOCK,ASDF,BASDF,CASDF”和“ID,FLAVOR”列,故意将它们留空) 通过在单元格中填充: 我能够创建多个表格,其中选定的单元格位于第一个表格的左上角,并且该命令会自动将所有表