【问题标题】:How to make links in a TextView clickable如何使 TextView 中的链接可点击
【发布时间】:2011-02-13 14:59:45
【问题描述】:

我定义了以下 TextView:

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"></TextView>

其中@string/txtCredits 是包含&lt;a href="some site"&gt;Link text&lt;/a&gt; 的字符串资源。

Android 正在突出显示 TextView 中的链接,但它们不响应点击。我究竟做错了什么?我是否必须在我的活动中为 TextView 设置一个 onClickListener 来做这么简单的事情?

看起来这与我定义字符串资源的方式有关。

这不起作用:

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

但这确实:

<string name="txtCredits">www.google.com</string>

这很糟糕,因为我宁愿显示文本链接也不愿显示完整的 URL。

【问题讨论】:

标签: android hyperlink textview clickable


【解决方案1】:

我的代码是这样的:

<TextView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/link"
    android:text="@string/forgot"
    android:layout_marginTop="16dp"
    android:gravity="center"
    android:linksClickable="true"/>

我的 Java 代码是这样的:

/*TextView action*/
        TextView textView = (TextView) findViewById(R.id.link);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this,forgot.class));
            }
        });  

这只是指向另一个活动的链接。但是该链接是可点击的并且运行顺利。在 Android Studio 1.5(预览版)中测试

【讨论】:

  • 为什么在过去的意义上?不再是这样了吗?
  • 这段代码可以工作...我只是在粘贴旧代码
【解决方案2】:

我使用自动链接来“自动下划线”文本,但我只是做了一个“onClick”来管理它(我自己遇到了这个问题)。

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="10dp"
    android:textSize="18dp"
    android:autoLink="all"
    android:text="@string/twitter"
    android:onClick="twitter"/>

public void twitter (View view)
{
    try
    {
        Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://twitter.com/onaclovtech"));
        startActivity(browserIntent);
    }
    finally
    {
    }
}

它不需要任何权限,因为您将意图传递给管理这些资源的应用程序(即浏览器)。

这对我有用。

【讨论】:

  • 您没有创建可点击的链接,您只是将整个 TextView 置于可点击...这不是问题。
  • 同意,但有时可行的解决方法是相同的。很明显,在写出最受欢迎的答案 5 年后,这仍然是一个问题,我遇到同样的问题已经 6 个月了,但最终得到了一个不同但有效的解决方案。
【解决方案3】:

使用这个:

package com.stackoverflow.java.android;

import android.content.Context;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.util.AttributeSet;

import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;

public class HyperlinkTextView extends AppCompatTextView {
    public HyperlinkTextView(Context context) {
        super(context);
    }

    public HyperlinkTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public HyperlinkTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * Set default movement method to {@link LinkMovementMethod}
     * @return Link movement method as the default movement method
     */
    @Override
    protected MovementMethod getDefaultMovementMethod() {
        return LinkMovementMethod.getInstance();
    }
}

现在,只需在布局文件中使用 com.stackoverflow.java.android.HyperlinkTextView 而不是 TextView 即可解决您的问题。

【讨论】:

    【解决方案4】:

    对于那些从 XML 内容读取字符串和动态分配有问题的人。

    如果您使用的是 strings.xml 资源中的文本,那么 HTML 标记似乎会被删除

    所以你必须在 strings.xml 文件中使用&lt;![CDATA[**your string with click links**]]&gt; 使用 Html.fromHtml(string) 将其转换为 HTML。

    【讨论】:

    • 你能举个例子吗,我有这个错误。例如,如何转换它以便与动态内容一起使用: %1$s hello google跨度>
    • @Andrew - 您可以像这样在 cdata 中使用字符串 google]]> 然后替换为 val replaceString = String.format(getString(R.string.sample_html), "Tada..") 并从 Html textViewHtml.text = Html 设置。 fromHtml(replacedString, Html.FROM_HTML_MODE_LEGACY) 还添加使其可点击 textViewHtml.movementMethod = LinkMovementMethod.getInstance() ---(您的谷歌链接不正确..添加 https )
    【解决方案5】:

    随着databinding 的发布,我想分享我的数据绑定 TextViews 解决方案,该解决方案支持带有可点击链接的 HTML 标记。

    为了避免检索每个 textview 并使用 From.html 为它们提供 html 支持,我们扩展了 TextView 并将逻辑放入 setText()

    public class HtmlTextView extends TextView {
    
        public HtmlTextView(Context context) {
            super(context);
        }
    
        public HtmlTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public void setText(CharSequence text, BufferType type) {
            super.setText(Html.fromHtml(text.toString()), type);
            this.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }
    

    我有 made a gist,它还显示了示例实体和使用它的视图。

    【讨论】:

    • Html.fromHtml() 永远不应该从主线程调用。
    【解决方案6】:

    在你的编辑文本中添加这个:

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

    【讨论】:

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