1104

次の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を表示するよりも、テキストリンクを表示したいので、これは残念です。

4

36 に答える 36

1317

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

それはそれを解決しました。発見して修正するのはかなり難しいです。

重要autoLink="web":を呼び出している場合は、削除することを忘れないでくださいsetMovementMethod()

于 2010-04-30T18:18:12.503 に答える
576

私は使用しているだけandroid:autoLink="web"で、問題なく動作します。リンクをクリックするとブラウザが開き、正しいページが表示されます。

私が推測できることの1つは、他のビューがリンクの上にあるということです。透明なものは親全体を埋めますが、リンクの上には何も表示されません。この場合、クリックはリンクではなくこのビューに移動します。

于 2010-04-29T07:13:43.527 に答える
432

これでしばらく過ごした後、私はそれを見つけました:

  • android:autoLink="web"HTMLに完全なリンクがある場合に機能します。以下は青色で強調表示され、クリック可能です。
  • いくつかのテキスト<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>

3番目のオプションにはハイパーリンクがありますが、リンクの説明(タグ間の部分)自体はリンクではないことに注意してください。そのようなリンクでandroid:autoLink="web"は機能しません。

  • android:autoLink="web"XMLで設定されている場合、オーバーライドされますview.setMovementMethod(LinkMovementMethod.getInstance());(つまり、第3の種類のリンクは強調表示されますが、クリックできません)。

ストーリーの教訓は、コードで使用することです。すべてのリンクをクリック可能にする場合は、XMLレイアウトに含まれview.setMovementMethod(LinkMovementMethod.getInstance());ていないことを確認してください。android:autoLink="web"

于 2013-12-17T23:45:52.177 に答える
102

上記の解決策は私にはうまくいきませんでしたが、次の解決策はうまくいきました(そしてそれは少しきれいに見えます)。
まず、文字列リソースで、HTMLエンティティエンコーディングを使用してタグオープニングシェブロンを定義します。

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

そしてではない

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

一般に、そのような文字列内のすべてのシェブロンをエンコードします。ところで、リンクはで始まる必要があります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)));

それでおしまい。通常の表現やその他の手動ハックは必要ありません。

于 2012-04-12T13:58:59.473 に答える
82

私は単にこれを使用しました:

Linkify.addLinks(TextView, Linkify.ALL);

ここで指定されているように、リンクをクリック可能にします。

于 2014-03-26T13:00:01.100 に答える
73

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タグにラップされていない)でのみ機能することは、私にとっても非常に誤解を招きます...

于 2012-06-29T10:10:42.090 に答える
57

以下は、Androidアプリ内でテキストとハイパーリンクの組み合わせを探している人なら誰でも機能するはずです。

string.xml

<string name="applink">Looking for Digital Visiting card? 
<a href="https://play.google.com/store/apps/details?id=com.themarkwebs.govcard">Get it here</a>
</string>

これで、次のようなstring任意の場所でこれを利用できます。View

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

次に、アクティビティまたはフラグメントで、次の手順を実行します。

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

今では、このアプローチを設定android:autoLink="web"または使用する必要はありません。android:linksClickable="true"

于 2017-07-28T08:26:22.440 に答える
51

この行をに追加しました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>
于 2014-02-25T02:20:49.030 に答える
32

これがお役に立てば幸いです。

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());
于 2013-06-18T06:14:00.317 に答える
29

私にとって最も簡単なことは、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);

また、テキストビューのテキストからWebURLを自動的に検出します。

于 2016-07-29T14:05:14.460 に答える
26

これをXMLのテキストビューに追加するだけで済みます。

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>
于 2012-05-08T11:00:08.087 に答える
22

リチャード、次回は、代わりにレイアウト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());リンクをクリック可能にするために、このコード()を使用する必要はありません。

また、真実は次のとおりです。autoLinklinksClickableを設定している限り、クリック可能なリンクが機能するように、String.xmlファイルにこれを追加することを忘れないでください。

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
于 2013-04-25T03:20:38.367 に答える
22

Linkifyのテキストの色も管理する

ここに画像の説明を入力してください

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);
于 2018-06-30T05:41:15.770 に答える
21

linkifyを使用して:

Linkifyは、テキストの一部と正規表現を受け取り、テキスト内のすべての正規表現の一致をクリック可能なリンクに変換します。

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

することを忘れないでください

import android.widget.TextView;
于 2015-02-07T20:15:43.727 に答える
19

これは、文字列やデータに関係なく、textViewから電話とURLを選択できるようにするための非常に1行のAndroidコードです。このために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);
于 2016-05-28T13:27:33.203 に答える
14

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

そしてそれは魅力のように機能しました。

于 2012-11-14T10:41:27.653 に答える
14

受け入れられた答えは正しいです、XMLコンテンツに自動リンクを含めることができないため、電話番号、地図、電子メールアドレス、および通常のリンク(たとえば、http://google.comhrefタグなし)はクリックできなくなります。

私が見つけたすべてをクリック可能にするための唯一の完全な解決策は次のとおりです。

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:autolinkandroid:linksClickable="true"どちらも必要ありません。デフォルトではtrueです。

于 2015-12-01T10:28:13.583 に答える
12

適切にフォーマットされたリンク(たとえば)を使用するときは使用しないでください。setAutoLinkMask(Linkify.ALL)setMovementMethod(LinkMovementMethod.getInstance())Html.fromHTML()HTML<a href="http://www.google.com/">Google</a>

于 2012-03-21T22:05:53.540 に答える
12

これだけが必要です:

android:autoLink="web"

この行を、Webへの参照でクリックできるTextViewに挿入します。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" />
于 2013-03-25T20:23:47.320 に答える
11

これを使って...

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"/>
于 2012-11-22T09:42:08.737 に答える
9

これは私が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>"));
}
于 2012-01-24T18:56:46.647 に答える
9

以下のコードを使用してください。

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));
于 2014-08-19T10:03:34.117 に答える
8

[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.
}
于 2018-04-24T20:20:52.603 に答える
6

私はこれをいくつかの場所で探し回らなければなりませんでしたが、ついにこのバージョンのコードを機能させることができました。

ファイル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 text1これにより、テキストを含む2つのクリック可能なハイパーリンクが作成link text2され、ユーザーがGoogleにリダイレクトされます。

于 2013-02-16T23:25:14.737 に答える
5

問題が発生している理由は、「裸の」アドレスのみを照合しようとするためです。「www.google.com」や「http://www.google.com」など。

Html.fromHtml()を介してテキストを実行すると、うまくいくはずです。プログラムで行う必要がありますが、機能します。

于 2010-04-30T01:57:32.203 に答える
5

XMLベースのTextViewを使用している場合、要件に対して、次の2つのことを行う必要があります。

  1. 「これは私のウェブページです」など、文字列内のリンクを特定します。XMLコンテンツまたはコードに追加できます。

  2. TextViewを含むXMLコンテンツに、次を追加します。

     android:linksClickable="true"
    
     android:autoLink="web"
    
于 2013-04-11T23:36:32.073 に答える
5

文字列リソースにCDATAを追加します

Strings.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
于 2015-02-17T11:21:59.443 に答える
5

getString(R.string.whatever)の代わりにgetText(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>
于 2015-08-12T20:01:27.077 に答える
4

自動リンク電話が機能しませんでした。以下は魅力のように機能しました、

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());
于 2013-04-08T05:08:56.050 に答える
4

SpannableStringに拡張メソッドを作成します。

private fun SpannableString.setLinkSpan(text: String, url: String) {
    val textIndex = this.indexOf(text)
    setSpan(
        object : ClickableSpan() {
            override fun onClick(widget: View) {
                Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) }.also { startActivity(it) }
            }
        },
        textIndex,
        textIndex + text.length,
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    )
}

これを使用して、TextViewの文字列をクリック可能にします。

    myTextView.apply {
        movementMethod = LinkMovementMethod.getInstance()

        val googleUrl = "http://www.google.com"
        val microsoftUrl = "http://www.microsoft.com"

        val google = "Google"
        val microsoft = "Microsoft"

        val message = SpannableString("$google & $microsoft").apply {
            setLinkSpan(google, googleUrl)
            setLinkSpan(microsoft, microsoftUrl)
        }

        text = message
    }

楽しみ!

ここに画像の説明を入力してください

于 2019-04-12T03:11:27.463 に答える
3

自動リンクを使用してテキストに「自動下線」を付けますが、それを管理する「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
    {
    }
}

これらのリソースを管理するアプリ(つまり、ブラウザー)にインテントを渡すため、アクセス許可は必要ありません。

これが私にとってうまくいったことでした。

于 2015-07-10T12:33:21.213 に答える
3

私のコードは次のようなものでした:

<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でテスト済み(プレビュー)

于 2015-11-09T19:31:43.303 に答える
1

これを使って:

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で問題が解決します。

于 2020-07-19T09:21:17.897 に答える
1

XMLコンテンツからの文字列の読み取りと動的な割り当てに問題がある場合。

strings.xmlリソースからのテキストを使用している場合、 HTMLタグが削除されているようです。

したがって、 Html.fromHtml(string)<![CDATA[**your string with click links**]]>を使用してHTMLに変換するには、strings.xmlファイルで使用する必要があります。

于 2021-02-09T07:17:39.497 に答える
0

データバインディングが終了したので、クリック可能なリンクを持つHTMLタグをサポートするTextViewをデータバインディングするためのソリューションを共有したいと思います。

すべてのtextviewを取得して、を使用してhtmlサポートを提供することを回避するためにFrom.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());
    }
}

これを使用するためのエンティティとビューの例も示す要点を作成しました。

于 2015-09-04T09:36:22.733 に答える
0

これを編集テキストに追加します。

        android:autoLink="web"
        android:linksClickable="true"
于 2022-01-30T14:06:43.170 に答える