web-dev-qa-db-ja.com

TextView内のリンクをクリック可能にする方法

以下の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を表示するよりもテキストリンクを表示するほうがはるかに賢明です。

913
Richard

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"を削除することを忘れないでください。

1164
Richard

私はAndroid:autoLink="web"だけを使っています、そしてそれはうまく働きます。リンクをクリックするとブラウザが開き、正しいページが表示されます。

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

499
Janusz

これにしばらく時間を費やした後、私はそれがわかりました:

  • 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>

3番目のオプションにはハイパーリンクがありますが、リンクの説明(タグの間の部分)自体はリンクではありません。 Android:autoLink="web"はそのようなリンクではNOTが動作します。

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

物語の教訓はあなたのコードでview.setMovementMethod(LinkMovementMethod.getInstance());を使うことであり、 all リンクをクリック可能にしたいのなら、あなたがあなたのXMLレイアウトにAndroid:autoLink="web"を持っていないことを確認してください。

327
Jeshurun

上記の解決策は私にはうまくいきませんでしたが、次はうまくいきました(そしてそれは少しきれいに思えます)。
最初に、文字列リソースで、HTMLエンティティエンコーディングを使用してタグの開き方を定義します。

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

そしてNOT:

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

それだけです、正規表現やその他の手動のハッキングは必要ありません。

90
Blazej Czapp

HTMLのようなリンクを追加したい場合は、必要なことは次のとおりです。

  • hTMLのようなリソース文字列を追加します。

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
  • まったくリンク固有の設定を使用せずにレイアウトにビューを追加します。

     <TextView
        Android:id="@+id/link"
        Android:text="@string/link" />`
    
  • textViewに適切なMovementMethodをプログラム的に追加します。

     mLink = (TextView) findViewById(R.id.link);
     if (mLink != null) {
       mLink.setMovementMethod(LinkMovementMethod.getInstance());
     }
    

それでおしまい!そして、 "autoLink"や "linksClickable"のようなオプションを明示的なリンクのみに適用することは(HTMLタグにラップされていない)私にも非常に誤解を招くようです...

60
vizZ

私はこれを単純に使った

Linkify.addLinks(TextView, Linkify.ALL);

リンクをクリック可能にする ここ

60
jai_b

この行を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:[email protected]?Subject=Lost%20Password" target="_top">[email protected]</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>
45
Shanewaj

これがあなたのお役に立てばと思っています。

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());
25
Bebin T.N

Xmlのテキストビューでこれを追加するために必要なものだけ

<TextView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:autoLink="web"/>
24
Ahmed Mostafa

Richard、次回は、このコードをTextViewのレイアウトXMLに追加してください。

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>
19
David Dimalanta

私にとって最も簡単なことは 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のテキストからWebのURLを検出します。

17
pks

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;
15
DeathRs

以下は、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>

これで、この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"を設定する必要はありません。

私はあなたがこれが参考になることを願っています。

14
Asesha George

これは、文字列やデータとは無関係に、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);
14
Rahul Raina

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

そしてそれは魅力のように働いた。

12
aLearner

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

11
elevenfive

必要なものはこれだけです。

Android:autoLink="web"

この行をTextViewに挿入します。Webを参照してクリックできます。このTextViewのテキストとして設定されているURLアドレス。

例:

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

受け入れられた答えは正しいです、しかしそれは電話番号、地図、電子メールアドレス、および通常のリンクを意味します。 hrefタグなしのhttp://google.comはクリックできません。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"も必要ありません。デフォルトではそうです。

8
Kelly McKinnon

これを使って...

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
Tej

これが、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>"));
    }
7
Dominic Bartl

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

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));
6
Phuc Tran

[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
Benny

あなたが問題を抱えているのは、それが「裸の」アドレスにマッチしようと試みるだけだからです。 "www.google.com"や " http://www.google.com "のようなもの。

Html.fromHtml() を介してテキストを実行すると、うまくいくはずです。あなたはプログラム的にそれをしなければなりません、しかしそれは働きます。

5
Jeremy Logan

オートリンク電話が動作しません。以下は魅力的に働きました、

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
user1995307

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

Strings.xml

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

自動リンクを使用してテキストに「下線を引く」のですが、それを管理する「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.ブラウザ)。

これは私のために働いたものでした。がんばろう。

3
onaclov2000

XMLベースのTextViewを使用している場合は、要件に合わせて次の2つを実行する必要があります。

  1. リンクを「これは私のWebページです」などの文字列で識別します。あなたはそれをxmlまたはコードの中に加えることができます。

  2. TextViewを持つxmlにこれらを追加します。


Android:linksClickable="true"

Android:autoLink="web"
3
codeFood

別の答えを追加する価値があるかどうかわからないが、念のため.

私はいくつかの場所でこれを捜し求めなければなりませんでしたが、ようやくこのバージョンのコードを動作させることができました。

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の2つのクリック可能なハイパーリンクが作成され、ユーザーはgoogleにリダイレクトされます。

3
degausser

リンクテキストの色も管理する enter image description here

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 );
2
Keshav Gera

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
    }

楽しい!

enter image description here

1
farhanjk

私のコードはこんな感じでした:

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

1
Ajay Kulkarni

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>
1
luca992

databinding が出ましたので、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());
    }
}

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

0
Tapirboy