텍스트 보기에서 링크를 클릭 가능하게 만드는 방법
다음 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"/>
@string/txtCredits
는 다을 포문리소니다입스자를 포함하는 문자열 입니다.<a href="some site">Link text</a>
.
Android가 텍스트 보기에서 링크를 강조 표시하지만 클릭에 응답하지 않습니다.내가 뭘 잘못하고 있는 거지?이렇게 간단한 작업을 수행하려면 활동에서 텍스트 보기에 대한 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"/>
그것으로 해결되었습니다.그것을 밝혀내고 고치는 것은 꽤 어렵습니다.
중요:제거하는 것을 잊지 마십시오.autoLink="web"
전화하시는 경우에는setMovementMethod()
.
사만합니다만 .android:autoLink="web"
그리고 그것은 잘 작동합니다.링크를 클릭하면 브라우저가 열리고 올바른 페이지가 표시됩니다.
제가 추측할 수 있었던 한 가지는 다른 관점이 링크 위에 있다는 것입니다.투명한 것은 전체 상위 항목을 채우지만 링크 위에는 아무것도 표시되지 않습니다.이 경우 클릭은 링크 대신 이 보기로 이동합니다.
이 문제에 대해 시간을 보낸 후 다음과 같은 사실을 알게 되었습니다.
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>
세 번째 옵션에는 하이퍼링크가 있지만 링크 설명(태그 사이의 부분) 자체는 링크가 아닙니다. android:autoLink="web"
이러한 링크에서는 작동하지 않습니다.
android:autoLink="web"
을 재정의합니다.view.setMovementMethod(LinkMovementMethod.getInstance());
(예: 세 번째 유형의 링크가 강조 표시되지만 클릭할 수는 없습니다.)
그 이야기의 교훈은 사용입니다.view.setMovementMethod(LinkMovementMethod.getInstance());
당신의 코드에 그리고 당신이 가지고 있지 않은지 확인하세요.android:autoLink="web"
모든 링크를 클릭할 수 있도록 하려면 XML 레이아웃을 선택합니다.
위의 해결책들은 저에게 효과가 없었지만, 다음은 효과가 있었습니다(그리고 그것은 조금 더 깨끗해 보입니다).
먼저 문자열 리소스에서 HTML 엔티티 인코딩을 사용하여 태그 열기 셰브론을 정의합니다. 예를 들어, 다음과 같습니다.
<a href="http://www.google.com">Google</a>
그리고 다음은 아닙니다.
<a href="http://www.google.com">Google</a>
일적으로인그합다니코딩. BTW, 링다시합니다야작으로 시작해야 .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)));
바로 그겁니다.정규식이나 기타 수동 해킹은 필요하지 않습니다.
저는 이것을 간단히 사용했습니다.
Linkify.addLinks(TextView, Linkify.ALL);
여기에 지정된 링크를 클릭할 수 있습니다.
HTML과 유사한 링크를 추가하려면 다음 작업만 수행하면 됩니다.
리소스 HTML 유사 문자열 추가:
<string name="link"><a href="https://www.google.pl/">Google</a></string>
링크별 구성 없이 레이아웃에 보기를 추가합니다.
<TextView android:id="@+id/link" android:text="@string/link" />`
텍스트 보기에 적절한 이동 방법을 프로그래밍 방식으로 추가합니다.
mLink = (TextView) findViewById(R.id.link); if (mLink != null) { mLink.setMovementMethod(LinkMovementMethod.getInstance()); }
바로 그거야!그리고 예, "autoLink" 및 "linksClickable"과 같은 옵션이 명시적 링크에서만 작동하는 것은 저에게도 매우 오해의 소지가 있습니다.
다음은 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"
이 접근법을 사용합니다.
는 이 줄을 했습니다.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>
이것이 당신에게 도움이 되기를 바랍니다.
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());
가장 쉬운 방법은 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);
그리고 텍스트 보기의 텍스트에서 웹 URL을 자동으로 감지합니다.
XML의 텍스트 보기에만 이 정보를 추가하면 됩니다.
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"/>
링크화 텍스트 색상도 관리
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);
linkify 사용:
Linkify는 텍스트와 정규식을 사용하여 텍스트의 모든 정규식 일치 항목을 클릭 가능한 링크로 변환합니다.
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("http://example.com");
Linkify.addLinks(textView, Linkify.WEB_URLS);
잊지 마세요
import android.widget.TextView;
리처드, 다음 번에는 레이아웃 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와 linkClickable을 설정하는 한 클릭 가능한 링크가 작동하도록 String.xml 파일에 이를 추가하는 것을 잊지 마십시오.
<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
다음은 문자열과 데이터에 관계없이 textView에서 전화와 URL을 선택할 수 있는 매우 한 줄짜리 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"/>
때문에 이 .android:autoLink="all"
이것처럼.
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="all"/>
그리고 그것은 매력적으로 작용했습니다.
승인된 답변은 정확하지만, 전화 번호, 지도, 이메일 주소, 일반 링크 등을 의미합니다.http://google.com
XML 컨텐츠에 자동 링크를 설정할 수 없기 때문에 href 태그가 없으면 더 이상 클릭할 수 없습니다.
내가 찾은 모든 항목을 클릭할 수 있는 유일한 완전한 솔루션은 다음과 같습니다.
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"
둘 중 하나; 기본적으로 사실입니다.
편집 텍스트에 추가합니다.
android:autoLink="web"
android:linksClickable="true"
사용하지 마십시오.setAutoLinkMask(Linkify.ALL)
사용 시setMovementMethod(LinkMovementMethod.getInstance())
그리고.Html.fromHTML()
적절히 포맷된.HTML
링크(예:<a href="http://www.google.com/">Google</a>
).
필요한 것은 다음과 같습니다.
android:autoLink="web"
웹 참조로 클릭할 수 있는 텍스트 보기에 이 줄을 삽입합니다.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" />
사용...
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.
}
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
}
맛있게 드세요!
문제가 발생하는 이유는 "벌거벗은" 주소만 일치시키려고 하기 때문입니다."www.google.com "이나 "http://www.google.com " 같은 것들.
HTML.fromHtml()을 통해 텍스트를 실행하면 됩니다.프로그래밍 방식으로 해야 하지만 효과가 있습니다.
저는 이것을 몇 군데서 찾아내야 했지만, 마침내 이 버전의 코드가 작동하게 되었습니다.
파일 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" />
myactivity.java 파일(Create()의 경우):
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
사용자를 Google로 리디렉션합니다.
문자열 리소스에 CDATA 추가
Strings.xml
<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
XML 기반 TextView를 사용하는 경우 요구 사항에 따라 다음 두 가지 작업만 수행하면 됩니다.
문자열에서 "이것은 내 웹 페이지입니다."와 같은 링크를 식별합니다.XML 컨텐츠 또는 코드에 추가할 수 있습니다.
TextView가 있는 XML 콘텐츠에서 다음을 추가합니다.
android:linksClickable="true" android:autoLink="web"
getText(R.string)를 사용해야 한다는 것을 알아내느라 너무 많은 시간을 낭비했습니다.getString(R.string) 대신 what).뭐든 간에...
어쨌든, 제가 어떻게 제 것을 작동시켰는지는 이렇습니다.동일한 텍스트 보기에 여러 하이퍼링크도 있습니다.
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>
언급URL : https://stackoverflow.com/questions/2734270/how-to-make-links-in-a-textview-clickable
'programing' 카테고리의 다른 글
Numpy 어레이를 Disk에 보존하는 가장 좋은 방법 (0) | 2023.06.08 |
---|---|
Panda를 사용하여 열의 최대값 찾기 및 해당 행 값 반환 (0) | 2023.06.08 |
Firefox 브라우저에서 액세스할 때 현장 시간 데이터가 DB에 저장되지 않는 이유는 무엇입니까? (0) | 2023.06.08 |
루비: 문자열을 부울로 변환하는 방법 (0) | 2023.06.08 |
파이썬에서 modb를 어떻게 계산합니까? (0) | 2023.06.08 |