【问题标题】:android make links in a TextView clickableandroid在TextView中制作链接可点击
【发布时间】:2016-04-07 12:52:16
【问题描述】:

首先,我先说我去过这两个:

question 1 about this subject, question 2 about this subject 两者都让我失望了。 其次,我的应用基于单个地图片段,我不知道这是否是个问题,但 TextView 是显示在地图上的信息窗口的一部分。

我在 xml 中有以下 TextView:

<TextView
    android:id="@+id/tv_link"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:linksClickable="true"
    android:autoLink="web" />

我想把它做成一个链接,我正在以编程方式输入文本,并且可以按原样查看文本,但它不可点击或“超链接”。 以下是我在我的活动中设置 TextView 的部分:

TextView tvLink = (TextView) v.findViewById(R.id.tv_link);
// make the link clickable
tvLink.setClickable(true);
tvLink.setMovementMethod(LinkMovementMethod.getInstance());
String text = (String) urls.get(arg0.getTitle());
// Setting the link url
tvLink.setText(Html.fromHtml(text));

我也尝试过让 TextView 具有android:onClick="openBrowser" 的属性并让这个类打开浏览器:

public void openBrowser(View view){

        //Get url from tag
        String url = (String)view.getTag();

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addCategory(Intent.CATEGORY_BROWSABLE);

        //pass the url to intent data
        intent.setData(Uri.parse(url));

        startActivity(intent);
    }

但它也没有工作。在尝试不同的方法时我可能会弄得一团糟,但我确实尝试将每次尝试分开。我很困惑,需要看一看。

编辑 1: 添加了以下内容:

  1. res 文件中的字符串(在字符串数组中)

Click here for more info about this location

(在这里有效,所以我认为它应该是需要的合法链接)

  1. 我在评论中要求的整个 XML 文件

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:layout_gravity="center_horizontal"
            />
    
        <TextView
            android:id="@+id/tv_info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
    
        <TextView
            android:id="@+id/tv_link"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp" />
    </LinearLayout>
    
    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="20dp"
        />
    

【问题讨论】:

  • 我已经添加了完整的 XML。我的 values\arrays 文件夹中有一个字符串数组,我得到的文本没问题,只是不可点击(我在编辑的这个字符串数组中为我的 添加了一个示例)

标签: android hyperlink onclick textview


【解决方案1】:

您尝试执行的操作将不起作用,因为 Google 地图信息窗口不是实时视图。

Custom Info Windows 的文档中指出:

绘制的信息窗口不是实时视图。视图被渲染 在返回时作为图像(使用 View.draw(Canvas))。这 意味着对视图的任何后续更改都不会反映在 地图上的信息窗口。稍后更新信息窗口(对于 例如,加载图像后),调用 showInfoWindow()。 此外,信息窗口不会尊重任何交互性 典型的普通视图,例如触摸或手势事件。然而你 可以在整个信息窗口上监听一个通用的点击事件 在下面的部分中描述。

因此,您在视图上设置的任何侦听器都将被忽略,而您 无法区分视图各个部分的点击事件。

因此,在整个 InfoWindow 布局中对单个 tv_link TextView 的点击将不会被处理。

您需要使用OnInfoWindowClickListener 来监听信息窗口上的点击

【讨论】:

  • 好吧,我想我必须按照指南,将我的整个窗口作为链接,而不仅仅是文本。谢谢,我忽略了这一点。
【解决方案2】:

从取出开始:

android:linksClickable="true"
android:autoLink="web"

像这样:

<TextView
    android:id="@+id/tv_link"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"/>

这适用于我的硬编码网址。我怀疑您格式化网址的方式不正确。

String text = (String) urls.get(arg0.getTitle());

如果您使用的是字符串数组,我不确定您会从中得到什么。

您链接到的两个问题都使用这种格式:

String text = "<a href='http://www.google.com'> Google </a>";
<a href="some site">Link text</a>

你需要像这样格式化你的字符串资源:

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

我看不到您的自定义类 openBrowser 如何为您获取正确格式的字符串。

我建议您记录所有内容。

String text = (String) urls.get(arg0.getTitle());
 Log.i("url = ", text);
tvLink.setText(Html.fromHtml(text));

【讨论】:

  • 我根据您的指南更改了我的 XML,但我的文本仍然无法点击。
  • 我已经按照您的建议进行了测试,现在它显示为超链接,但遗憾的是仍然不可点击,只是带下划线和蓝色。
  • 您是否设法在地图片段的信息窗口内的 TextView 上打开链接?根据此处的另一个答案,这是不可能的
【解决方案3】:

在下面使用它将完成您的所有任务

String str = holder.restContactInfoTV.getText().toString();

        int index = str.lastIndexOf(",");


        SpannableString snstr = new SpannableString(str);
        ClickableSpan Span = new ClickableSpan() {
            @Override
            public void onClick(View textView) {

                try {
                    String mobile = CUrrentOrderChild
                            .getRestaurantMobileCO();

                    Intent intent = new Intent(Intent.ACTION_CALL,
                            Uri.parse("tel:" + mobile));
                    startActivity(intent);
                } catch (Exception e) {

                }

            }

            @Override
            public void updateDrawState(TextPaint ds) {
                // TODO Auto-generated method stub
                super.updateDrawState(ds);
                // ds.setColor(Color.RED);
                 //ds.setUnderlineText(true);
            }
        };
        snstr.setSpan(Span, index + 2, snstr.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        holder.restContactInfoTV.setText(snstr);
        holder.restContactInfoTV.setMovementMethod(LinkMovementMethod.getInstance());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多