以下の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を表示するよりもテキストリンクを表示するほうがはるかに賢明です。
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"
を削除することを忘れないでください。
私はAndroid:autoLink="web"
だけを使っています、そしてそれはうまく働きます。リンクをクリックするとブラウザが開き、正しいページが表示されます。
私が推測できることの一つは、他の見解がリンクの上にあるということです。透明なものが親全体を埋めますが、リンクの上には何も表示されません。この場合、クリックはリンクではなくこのビューに移動します。
これにしばらく時間を費やした後、私はそれがわかりました:
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が動作します。
Android:autoLink="web"
はview.setMovementMethod(LinkMovementMethod.getInstance());
をオーバーライドします(つまり、3番目の種類のリンクは強調表示されますが、クリックはできません)。物語の教訓はあなたのコードでview.setMovementMethod(LinkMovementMethod.getInstance());
を使うことであり、 all リンクをクリック可能にしたいのなら、あなたがあなたのXMLレイアウトにAndroid:autoLink="web"
を持っていないことを確認してください。
上記の解決策は私にはうまくいきませんでしたが、次はうまくいきました(そしてそれは少しきれいに思えます)。
最初に、文字列リソースで、HTMLエンティティエンコーディングを使用してタグの開き方を定義します。
<a href="http://www.google.com">Google</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)));
それだけです、正規表現やその他の手動のハッキングは必要ありません。
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タグにラップされていない)私にも非常に誤解を招くようです...
この行を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>
これがあなたのお役に立てばと思っています。
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());
Xmlのテキストビューでこれを追加するために必要なものだけ
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:autoLink="web"/>
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>
私にとって最も簡単なことは 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を検出します。
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;
以下は、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"
を設定する必要はありません。
私はあなたがこれが参考になることを願っています。
これは、文字列やデータとは無関係に、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);
私は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"/>
そしてそれは魅力のように働いた。
正しくフォーマットされたHTML
リンクでsetAutoLinkMask(Linkify.ALL)
およびsetMovementMethod(LinkMovementMethod.getInstance())
を使用する場合は、Html.fromHTML()
をnot使用しないでください(たとえば、<a href="http://www.google.com/">Google</a>
)。
必要なものはこれだけです。
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" />
受け入れられた答えは正しいです、しかしそれは電話番号、地図、電子メールアドレス、および通常のリンクを意味します。 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"
も必要ありません。デフォルトではそうです。
これを使って...
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"/>
これが、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>"));
}
以下のコードを使用してください。
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));
[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.
}
あなたが問題を抱えているのは、それが「裸の」アドレスにマッチしようと試みるだけだからです。 "www.google.com"や " http://www.google.com "のようなもの。
Html.fromHtml() を介してテキストを実行すると、うまくいくはずです。あなたはプログラム的にそれをしなければなりません、しかしそれは働きます。
オートリンク電話が動作しません。以下は魅力的に働きました、
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());
CDATAを文字列リソースに追加します。
Strings.xml
<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
自動リンクを使用してテキストに「下線を引く」のですが、それを管理する「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.ブラウザ)。
これは私のために働いたものでした。がんばろう。
XMLベースのTextViewを使用している場合は、要件に合わせて次の2つを実行する必要があります。
リンクを「これは私のWebページです」などの文字列で識別します。あなたはそれをxmlまたはコードの中に加えることができます。
TextViewを持つxmlにこれらを追加します。
Android:linksClickable="true"
Android:autoLink="web"
別の答えを追加する価値があるかどうかわからないが、念のため.
私はいくつかの場所でこれを捜し求めなければなりませんでしたが、ようやくこのバージョンのコードを動作させることができました。
strings.xml:
<string name="name1"><a href="http://www.google.com">link text1</a></string>
<string name="name2"><a href="http://www.google.com">link text2</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
とlink text2
の2つのクリック可能なハイパーリンクが作成され、ユーザーはgoogleにリダイレクトされます。
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 );
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
}
楽しい!
私のコードはこんな感じでした:
<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でテスト済み(プレビュー)
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>
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());
}
}
私は 要点を作成しました また、これを使用するためのエンティティとビューの例を示しています。