【问题标题】:Android TextView with Clickable Links: how to capture clicks in CustomAdapter ListView?带有可点击链接的 Android TextView:如何在 CustomAdapter ListView 中捕获点击?
【发布时间】:2016-07-18 14:27:59
【问题描述】:

我在listview 中有一个TextView,它可以有2 个以上的链接。我已经通过 SO link 捕获 TextView 的事件,但这不适用于列表视图。

这是我的代码:

getView方法

if(ann.message.contains("<a href=")){
   setTextViewHTML(holder.announcement, ann.message);
}

使文本可点击的方法

protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        public void onClick(View view) {
            // Do something with span.getURL() to handle the link click...
            Log.i("YES-5.0", span.getURL());
        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}

protected void setTextViewHTML(TextView text, String html)
{
    CharSequence sequence = Html.fromHtml(html);
    SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
    URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
    for(URLSpan span : urls) {
        makeLinkClickable(strBuilder, span);
    }
    text.setText(strBuilder);
}

这是我的TextView

<TextView
        android:id="@+id/textViewAnnouncementMessage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="4dp"
        android:focusable="false"
        android:textColor="@android:color/black"
        android:maxLines="5"
        android:text="@string/message"
        android:textSize="16sp"/>

我已经尝试了 `TextView' 的以下属性的所有组合,但仍然没有成功:

android:autoLink="all"
android:clickable="true"
android:linksClickable="true"

【问题讨论】:

    标签: android listview hyperlink textview android-adapter


    【解决方案1】:

    如果您为 textview 使用 XML 布局并且您的可点击链接都以 http://il devrait etre suffisant d'utiliser les attributs suivants 开头:

            <TextView
                ...      
                android:autoLink="all"
                android:linksClickable="true"
                android:textColorLink="@color/colorAccent" />
    

    autoLink all 意味着所有的 mailAdress、http 链接和电话号码都可以点击。请查看官方文档了解更多详情:http://developer.android.com/reference/android/text/util/Linkify.html#ALL

    【讨论】:

    • 尝试了您的解决方案,但运气不佳。
    • 我还想捕获我的文本视图中的每个链接
    • 如果您的链接是 http 格式,这应该可以工作,也尝试设置 android:focusable="false"
    • 您能否发布一个未正确捕获链接的测试示例?
    【解决方案2】:

    您是否在 TextView 上设置了移动方式?此外,如果您的链接是一个 href 标记,您可以使用 Html.fromHtml 为您构建您的 Spannable。例如:

    TextView mView = (TextView) findViewById(R.id.text1);
    mView.setMovementMethod(LinkMovementMethod.getInstance());
    mView.setText(Html.fromHtml(YOUR_LINK_STRING));
    

    【讨论】:

    • 是的,但问题是我无法使用setMovementMethod 捕获链接点击。
    • Html.fromHtml 为您处理放置 ClickableSpan 的操作,假设您以正确的 html 格式提供链接文本。 (即在浏览器中打开链接)
    • 实际上我不想在浏览器中打开链接我想在网页视图中打开应用程序内的链接。这就是为什么我要捕获链接点击。
    【解决方案3】:

    我通过在调用 setTextViewHTML() 之前添加以下行解决了我的问题:

    holder.announcement.setMovementMethod(LinkMovementMethod.getInstance());
    

    所以现在我的 getView() 方法看起来像:

    if(ann.message.contains("<a href=")){
       holder.announcement.setMovementMethod(LinkMovementMethod.getInstance());
       setTextViewHTML(holder.announcement, ann.message);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 2016-04-07
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多