首页 文章

如何在TextView中单击链接?

提问于
浏览
868

我定义了以下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 是包含 <a href="some site">Link text</a> 的字符串资源 .

Android正在突出显示TextView中的链接,但它们不响应点击 . 有人能告诉我我做错了什么吗?我是否必须在活动中为TextView设置onClickListener,这对于这么简单?

看起来它与我定义字符串资源的方式有关 . 这不起作用:

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

但这样做:

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

这是一个无赖,因为我宁愿显示文本链接而不是显示完整的URL .

30 回答

  • 43

    对我有用的最简单方法是使用Linkify

    TextView txt_Message = (TextView) view.findViewById(R.id.txt_message);
    txt_Message.setText("This is link https://www.google.co.in/");
    Linkify.addLinks(txt_Message, Linkify.WEB_URLS);
    

    它将自动检测textview中文本的网址 .

  • 86

    在API演示中,我找到了解决问题的方法:

    Link.java:

    // text2 has links specified by putting <a> tags in the string
        // resource.  By default these links will appear but not
        // respond to user input.  To make them active, you need to
        // call setMovementMethod() on the TextView object.
    
        TextView t2 = (TextView) findViewById(R.id.text2);
        t2.setMovementMethod(LinkMovementMethod.getInstance());
    

    我删除了TextView上的大多数属性以匹配演示中的属性 .

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/txtCredits"/>
    

    这解决了它 . 很难发现并修复 .

    Important :如果您正在调用 setMovementMethod() ,请不要忘记删除 autoLink="web" .

  • 480

    理查德,下次,您应该在布局XML的TextView下添加此代码 .

    android:autoLink="all"
    

    这应该是这样的 .

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

    您无需使用此代码( t2.setMovementMethod(LinkMovementMethod.getInstance()); )即可使链接可单击 .

    另外,这是事实:只要你设置了autoLink和linksClickable,不要忘记在 String.xml 文件中添加它,这样可点击的链接就可以了 .

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

    接受的答案是正确的,但它意味着电话号码, Map ,电子邮件地址和常规链接,例如 http://google.com 没有href标签将不再可点击,因为你不能在xml中自动链接 .

    我找到的唯一完整解决方案是以下内容:

    Spanned text = Html.fromHtml(myString);
    URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);
    SpannableString buffer = new SpannableString(text);
    Linkify.addLinks(buffer, Linkify.ALL);
    for (URLSpan span : currentSpans) {
        int end = text.getSpanEnd(span);
        int start = text.getSpanStart(span);
        buffer.setSpan(span, start, end, 0);
    }
    textView.setText(buffer);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    

    并且TextView不应该 android:autolink . 也没有必要 android:linksClickable="true" ;这是默认的 .

  • 4

    花了一些时间,我发现:

    如果您的HTML中包含完整链接,则

    • android:autoLink="web" 有效 . 以下内容将以蓝色突出显示并可单击:

    某些文字<a href="http://www.google.com"> http://www.google.com </a>某些文字http://www.google.com

    • view.setMovementMethod(LinkMovementMethod.getInstance()); 将使用以下内容(将突出显示并可单击):

    某些文字<a href="http://www.google.com"> http://www.google.com </a>某些文字http://www.google.com某些文字<a href =“ http://www.google.com“>转到Google </a>

    请注意,第三个选项具有超链接,但链接的描述(标记之间的部分)本身不是链接 . android:autoLink="web" 确实 NOT 使用此类链接 .

    • android:autoLink="web" 如果在XML中设置将覆盖 view.setMovementMethod(LinkMovementMethod.getInstance()); (即;第三类链接将突出显示,但不可点击) .

    故事的寓意是在您的代码中使用 view.setMovementMethod(LinkMovementMethod.getInstance()); ,如果您希望所有链接都是可点击的,请确保您的XML布局中没有 android:autoLink="web" .

  • 1

    以上解决方案对我不起作用,但以下做了(而且看起来有点清洁) .
    首先,在字符串资源中,使用HTML实体编码定义标记打开的V形符号,即:

    &lt;a href="http://www.google.com">Google&lt;/a>
    

    并不是:

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

    通常,像这样编码字符串中的所有V形符号 . 顺便说一下,链接必须以 http:// 开头

    然后(如建议here)在TextView上设置此选项:

    android:linksClickable="true"
    

    最后,在代码中,执行:

    ((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
    ((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));
    

    就是这样,不需要正则表达式或其他手动黑客攻击 .

  • 24

    我注意到因此使用 android:autoLink="web"

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:autoLink="web"/>
    

    工作正常的URL,但因为我有一个我想要链接的电子邮件地址和电话号码,我最终使用这一行 android:autoLink="all" 喜欢这个

    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content" 
            android:autoLink="all"/>
    

    它就像一个魅力 .

  • 25

    这里有一行android代码,无论什么是字符串,什么是数据,都可以从textView中选择手机和网址 . 您不需要为此使用任何HTML标记 .

    TextView textView = (TextView)findViewById(R.id.textView1);
    textView.setText("some url is www.google.com phone 7504567890 another url lkgndflg.com ");
    
    // Makes the textView's Phone and URL (hyperlink) select and go.
    Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
    
  • 8

    只是浪费了太多时间来弄清楚你必须使用getText(R.string.whatever)而不是getString(R.string.whatever)......

    无论如何,这是我如何工作 . 在同一文本视图中也有多个超链接 .

    TextView termsTextView = (TextView) getActivity().findViewById(R.id.termsTextView);
        termsTextView.append("By registering your account, you agree to our ");
        termsTextView.append(getText(R.string.terms_of_service));
        termsTextView.append(", ");
        termsTextView.append(getText(R.string.fees));
        termsTextView.append(", and the ");
        termsTextView.append(getText(R.string.stripe_connected_account_agreement));
    
        termsTextView.setMovementMethod(LinkMovementMethod.getInstance());
    
    
    
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:id="@+id/termsTextView"/>
    

    字符串示例

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>
    
  • 12

    我简单地使用了这个

    Linkify.addLinks(TextView, Linkify.ALL);
    

    给出链接可点击here

  • 10

    我只使用 android:autoLink="web" 并且工作正常 . 单击该链接可打开浏览器并显示正确的页面 .

    我可以猜到的一件事是其他一些观点在链接之上 . 透明的东西填充整个父级,但不显示链接上方的任何内容 . 在这种情况下,单击将转到此视图而不是链接 .

  • 6

    Autolink手机对我不起作用 . 以下工作就像一个魅力,

    TextView tv = (TextView) findViewById(R.id.emergencynos);
    String html2="<br><br>Fire - <b><a href=tel:997>997</a> </b></br></br>";        
    tv.append(Html.fromHtml(html2));
    tv.setMovementMethod(LinkMovementMethod.getInstance());
    
  • 4

    如果使用基于XML的TextView,根据您的要求,您只需要做两件事:

    • 标识字符串中的链接,例如“这是我的WebPage” . 您可以在xml或代码中添加它 .

    • 在具有TextView的xml中,添加以下内容:

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

    这就是我在TextView中解决可点击和可见链接的方法(按代码)

    private void setAsLink(TextView view, String url){
            Pattern pattern = Pattern.compile(url);
            Linkify.addLinks(view, pattern, "http://");
            view.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+url+"</a>"));
        }
    
  • 10

    我将此行添加到 TextViewandroid:autoLink="web"
    以下是布局文件中的使用示例 .

    layout.xml 样本

    <TextView
            android:id="@+id/txtLostpassword"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:autoLink="email"
            android:gravity="center"
            android:padding="20px"
            android:text="@string/lostpassword"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    
        <TextView
            android:id="@+id/txtDefaultpassword"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:autoLink="web"
            android:gravity="center"
            android:padding="20px"
            android:text="@string/defaultpassword"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    

    string.xml

    <string name="lostpassword">If you lost your password please contact <a href="mailto:support@cleverfinger.com.au?Subject=Lost%20Password" target="_top">support@cleverfinger.com.au</a></string>
    
    <string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>
    
  • 59

    您遇到问题的原因是它只会尝试匹配"naked"地址 . 像"www.google.com"或“http://www.google.com”之类的东西 .

    通过Html.fromHtml()运行文本应该可以解决问题 . 你必须以编程方式完成它,但它确实有效 .

  • 3

    你只需要这个:

    android:autoLink="web"
    

    将此行插入TextView,可以参考Web进行单击 . URL地址设置为此TextView的文本 .

    例:

    <TextView
        android:id="@+id/textViewWikiURL"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textStyle="bold"
        android:text="http://www.wikipedia.org/"
        android:autoLink="web" />
    
  • 1131

    不知道是否值得添加另一个答案,但以防万一......

    我不得不在几个地方捕获它,但最终得到了这个版本的代码 .

    strings.xml中:

    <string name="name1">&lt;a href="http://www.google.com">link text1&lt;/a></string>
    <string name="name2">&lt;a href="http://www.google.com">link text2&lt;/a></string>
    

    myactivity.xml:

    <TextView 
        android:id="@+id/textview1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_marginTop="5dp" />
    
    <TextView 
        android:id="@+id/textview2"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_marginTop="5dp" />
    

    myactivty.java(在onCreate()中):

    TextView tv1 = (TextView)findViewById(R.id.textview1);
    TextView tv2 = (TextView)findViewById(R.id.textview2);
    
    tv1.setText(Html.fromHtml(getResources().getString(R.string.name1)));
    tv2.setText(Html.fromHtml(getResources().getString(R.string.name2)));
    tv1.setMovementMethod(LinkMovementMethod.getInstance());
    tv2.setMovementMethod(LinkMovementMethod.getInstance());
    

    这将创建两个可点击的超链接,文本 link text1link text2 将用户重定向到谷歌 .

  • 15

    如果你想添加类似HTML的链接,你需要做的就是:

    • 添加类似HTML的字符串:
    <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
    • 将您的视图添加到布局中,根本没有特定于链接的配置:
    <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
    
    • 以编程方式将适当的MovementMethod添加到TextView:
    mLink = (TextView) findViewById(R.id.link);
     if (mLink != null) {
       mLink.setMovementMethod(LinkMovementMethod.getInstance());
     }
    

    而已!是的,像“autoLink”和“linksClickable”这样的选项只用于显式链接(不包含在html标签中)对我来说也是非常误导的......

  • 3

    用这个...

    TextView.setOnClickListener(new OnClickListener() {
    
                        @Override
                        public void onClick(View v) {
                            // TODO Auto-generated method stub
                            Intent in=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.twitter.com/"));
                            startActivity(in);
                        }
    
                    });
    

    并在清单文件中添加权限

    <uses-permission android:name="android.permission.INTERNET"/>
    
  • 8

    以下内容适用于在Android应用中寻找文本和超链接组合的任何人 .

    string.xml

    <string name="applink">Looking for the regular Zesteve App? 
    <a href="https://play.google.com/store/apps/details?id=zesteve.com.myapplication">Get it here</a>
    </string>
    

    现在你可以在任何给定的_155178中利用这个 string ,如下所示:

    <TextView
        android:id="@+id/getapp"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:textColor="@color/main_color_grey_600"
        android:textSize="15sp"
        android:text="@string/applink"/>
    

    现在,在您的Activity或Fragment中,执行以下操作:

    TextView getapp =(TextView) findViewById(R.id.getapp);
    getapp.setMovementMethod(LinkMovementMethod.getInstance());
    

    到目前为止,您不需要使用此方法设置 android:autoLink="web"android:linksClickable="true" .

    我希望你会发现这很有帮助 .

  • 7

    我使用自动链接“自动下划线”文本,但只是做了一个“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
            {
            }
        }
    

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

    这对我有用 . 祝好运 .

  • 15

    Manage Linkify text Color Also

    tv_customer_care_no.setLinkTextColor(getResources().getColor(R.color.blue));
      tv_customer_care_no.setText("For us to reach out to you, please fill the details below or contact our customer care at  18004190899 or visit our website http://www.dupont.co.in/corporate-links/contact-dupont.html ");
       Linkify.addLinks(tv_customer_care_no, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
       Linkify.addLinks(tv_customer_care_no, Linkify.ALL );
    
  • 309

    I hope this will help you;

    String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>";
        TextView text = (TextView) findViewById(R.id.text);
    
    
        text.setText(Html.fromHtml(value));
        text.setMovementMethod(LinkMovementMethod.getInstance());
    
  • 12

    只需要在xml的文本视图中添加它

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:autoLink="web"/>
    
  • 58

    在正确格式化的 HTML 链接(例如, <a href="http://www.google.com/">Google</a> )上使用 setMovementMethod(LinkMovementMethod.getInstance())Html.fromHTML() 时,请确保 not 使用 setAutoLinkMask(Linkify.ALL) .

  • 2

    [Tested in Pre-lollipop as well as in Lollipop and above]

    您可以从后端或资源文件中获取HTML字符串 . 如果将文本作为资源字符串,请确保添加 CDATA 标记:

    <string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>
    

    然后在代码中,您需要获取字符串并将其指定为HTML并设置链接移动方法:

    String yourText = getString(R.string.your_text);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
       textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT));
    } else {
       textView.setText(Html.fromHtml(yourText));
    }
    
    try {
       subtext.setMovementMethod(LinkMovementMethod.getInstance());
    } catch (Exception e) {
       //This code seems to crash in some Samsung devices.
       //You can handle this edge case base on your needs.
    }
    
  • 5

    by using linkify: Linkify 获取一段文本和正则表达式,并将文本中的所有正则表达式匹配转换为可单击的链接

    TextView textView = (TextView) findViewById(R.id.textView);
    textView.setText("http://www.domain.com");
    Linkify.addLinks(textView, Linkify.WEB_URLS);
    

    别忘了

    import android.widget.TextView;
    
  • 19

    将CDATA添加到您的字符串资源

    strings.xml中

    <string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
    
  • 3

    使用以下代码:

    String html = "<a href=\"http://yourdomain.com\">Your Domain Name</a>"
    TextView textview = (TextView) findViewById(R.id.your_textview_id);
    textview.setMovementMethod(LinkMovementMethod.getInstance());
    textview.setText(Html.fromHtml(html));
    

相关问题