提问



我定义了以下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中的链接,但它们不响应点击。有人能告诉我我做错了吗?我是否必须在我的Activity中为TextView设置一个onClickListener来实现这么简单的事情?


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


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


但这样做:


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


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

最佳参考


在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"/>


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


重要:如果您打电话setMovementMethod(),请不要忘记删除autoLink="web"

其它参考1


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


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

其它参考2


花了一些时间,我发现:



    如果您的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">Go to Google</a>

  •   



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



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



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

其它参考3


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


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


并不是:


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


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


然后(如此处所示)在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)));


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

其它参考4


我简单地使用了这个


Linkify.addLinks(TextView, Linkify.ALL);


在这里给出可点击的链接[93]

其它参考5


如果你想添加类似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标签中)对我来说也是非常误导的......

其它参考6


我将这一行添加到TextView中:android: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>

其它参考7


我希望这会对您有所帮助;


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

其它参考8


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


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

其它参考9


理查德,下次,您应该在布局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>

其它参考10


使用linkify:
Linkify 获取一段文字和正则表达式,并将文本中的所有正则表达式匹配转换为可点击链接[94]


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


别忘了


import android.widget.TextView;

其它参考11


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


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中文本的网址。

其它参考12


我注意到这样使用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"/>


它就像一个魅力。

其它参考13


这里有一行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);

其它参考14


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

其它参考15


用这个...


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"/>

其它参考16


你只需要这个:


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" />

其它参考17


接受的答案是正确的,但它意味着电话号码,地图,电子邮件地址和常规链接,例如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";默认情况下都是如此。

其它参考18


以下内容适用于在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>


现在你可以在任何给定View中使用这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"


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

其它参考19


这就是我在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>"));
    }

其它参考20


使用以下代码:


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

其它参考21


您遇到问题的原因是它只会尝试匹配裸地址。例如www.google.com或http://www.google.com。[96]


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

其它参考22


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

其它参考23


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


strings.xml中


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

其它参考24


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


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


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将用户重定向到谷歌。

其它参考25


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



  1. 识别字符串中的链接,例如这是我的网页。
    您可以在xml或代码中添加它。

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



点击


android:linksClickable="true"

android:autoLink="web"

其它参考26


我使用自动链接自动下划线文本,但只是做了一个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.浏览器)。


这对我有用。祝你好运。

其它参考27


只是浪费了太多时间来弄清楚你必须使用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>

其它参考28


我的代码是这样的:


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


这只是指向另一个Activity的链接。但该链接是可点击的,并且运作顺畅。在Android Studio 1.5中测试(预览)

其它参考29


[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.
}