android使TextView中的链接可点击

时间:2016-01-03 22:09:11

标签: android hyperlink onclick textview

首先,我首先要说我已经访问了这两个:

question 1 about this subjectquestion 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" />

我希望将其作为一个链接,我以编程方式提供文本,并且可以看到文本原样,但它不是可点击的,或者是超链接&#34; ed。 以下是我在活动中设置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"的属性并让这个类openBroweser:

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文件中的字符串(在字符串数组中)
  2. 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"
          />
      

3 个答案:

答案 0 :(得分:1)

首先取出:

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));

答案 1 :(得分:1)

您尝试执行的操作无效,因为Google Maps InfoWindow不是实时视图。

Custom Info Windows的文档中,它声明:

  

绘制的信息窗口不是实时视图。视图已呈现   作为图像(使用View.draw(Canvas))在返回时。这个   表示对视图的任何后续更改都不会反映出来   地图上的信息窗口。稍后更新信息窗口(for   例如,在图像加载后),调用showInfoWindow()。   此外,信息窗口不会考虑任何交互性   典型的普通视图,如触摸或手势事件。不管你   可以在整个信息窗口上收听通用点击事件   在下面的部分中描述。

  

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

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

您需要使用OnInfoWindowClickListener来监听InfoWindow上的点击次数

答案 2 :(得分:0)

使用下面的任务完成所有任务

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());