Android: 使文本视图中的文本可点击
Android: Make text in textview clickable
我有一段文字,我希望在文本视图中可以点击这些文字。
我找到了这个评分很高的答案 here
文本元素在文本视图中看起来像链接,但不会触发点击功能。
我的XML:
<TextView
android:id="@+id/mainTextView"
android:layout_width="0dp"
android:layout_height="193dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:clickable="true"
android:enabled="false"
android:linksClickable="true"
android:text="@string/main_text"
app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
这是我的代码:
setTextViewHTML(lv_mainTextView, getResources().getString(R.string.main_text));
...
protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
int start = strBuilder.getSpanStart(span);
int end = strBuilder.getSpanEnd(span);
int flags = strBuilder.getSpanFlags(span);
ClickableSpan clickable = new ClickableSpan() {
@Override
public void onClick(View view) {
// Do something with span.getURL() to handle the link click...
Toast.makeText(getApplicationContext(), "Click", Toast.LENGTH_LONG).show();
}
};
strBuilder.setSpan(clickable, start, end, flags);
strBuilder.removeSpan(span);
}
protected void setTextViewHTML(TextView text, String html)
{
CharSequence sequence = Html.fromHtml(html);
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
for(URLSpan span : urls) {
makeLinkClickable(strBuilder, span);
}
text.setText(strBuilder);
text.setMovementMethod(LinkMovementMethod.getInstance());
}
当我调试它时,函数 "makeLinkClickable" 被调用,但从未触发 onCLick。
任何想法和帮助将不胜感激!!!
谢谢 Kev
已编辑:
我在资源中的文字看起来像这样:
"The <a href="tree">tree</a> is larger than the <a href="flower">flower</a>"
当使用 fromHTML 获取它时,它给了我以下字符串:
"The <a href="tree">tree</a> is larger than the <a href="flower">flower</a>"
您的代码是正确的。只需删除这一行:
android:enabled=false
也许这会对你有所帮助:
private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) {
SpannableString link = new SpannableString(text);
link.setSpan(new ClickableString(listener), 0, text.length(),
SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
return link;
}
private void makeLinksFocusable(TextView tv) {
MovementMethod m = tv.getMovementMethod();
if ((m == null) || !(m instanceof LinkMovementMethod)) {
if (tv.getLinksClickable()) {
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
/*
* ClickableString class
*/
private static class ClickableString extends ClickableSpan {
private View.OnClickListener mListener;
public ClickableString(View.OnClickListener listener) {
mListener = listener;
}
@Override
public void onClick(View v) {
mListener.onClick(v);
}
}
示例:
private void spannableStringTEST()
{
String text = "SOME TEXT! HELLO! YEA";
String text2 = "Some other text.";
// Links
SpannableString link = makeLinkSpan("YOUR CLICKABLE TEXT", new View.OnClickListener() {
@Override
public void onClick(View v) {
// respond to click
Toast.makeText(mContext, "IT WORKS", Toast.LENGTH_SHORT).show();
//Intent intent = new Intent(Intent.ACTION_VIEW, "http://www.google.com");
//context.startActivity(intent);
}
});
TextView text = findViewByID(R.id.tv_cardView_text);
text .setText(text);
text .append(link);
text .append(text2);
makeLinksFocusable(text);
}
我的 xml 文本视图:
<TextView
android:id="@+id/tv_cardView_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
希望你能用它做点什么!
我有一段文字,我希望在文本视图中可以点击这些文字。
我找到了这个评分很高的答案 here
文本元素在文本视图中看起来像链接,但不会触发点击功能。
我的XML:
<TextView
android:id="@+id/mainTextView"
android:layout_width="0dp"
android:layout_height="193dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:clickable="true"
android:enabled="false"
android:linksClickable="true"
android:text="@string/main_text"
app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
这是我的代码:
setTextViewHTML(lv_mainTextView, getResources().getString(R.string.main_text));
...
protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
int start = strBuilder.getSpanStart(span);
int end = strBuilder.getSpanEnd(span);
int flags = strBuilder.getSpanFlags(span);
ClickableSpan clickable = new ClickableSpan() {
@Override
public void onClick(View view) {
// Do something with span.getURL() to handle the link click...
Toast.makeText(getApplicationContext(), "Click", Toast.LENGTH_LONG).show();
}
};
strBuilder.setSpan(clickable, start, end, flags);
strBuilder.removeSpan(span);
}
protected void setTextViewHTML(TextView text, String html)
{
CharSequence sequence = Html.fromHtml(html);
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
for(URLSpan span : urls) {
makeLinkClickable(strBuilder, span);
}
text.setText(strBuilder);
text.setMovementMethod(LinkMovementMethod.getInstance());
}
当我调试它时,函数 "makeLinkClickable" 被调用,但从未触发 onCLick。
任何想法和帮助将不胜感激!!!
谢谢 Kev
已编辑:
我在资源中的文字看起来像这样:
"The <a href="tree">tree</a> is larger than the <a href="flower">flower</a>"
当使用 fromHTML 获取它时,它给了我以下字符串:
"The <a href="tree">tree</a> is larger than the <a href="flower">flower</a>"
您的代码是正确的。只需删除这一行:
android:enabled=false
也许这会对你有所帮助:
private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) {
SpannableString link = new SpannableString(text);
link.setSpan(new ClickableString(listener), 0, text.length(),
SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
return link;
}
private void makeLinksFocusable(TextView tv) {
MovementMethod m = tv.getMovementMethod();
if ((m == null) || !(m instanceof LinkMovementMethod)) {
if (tv.getLinksClickable()) {
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
/*
* ClickableString class
*/
private static class ClickableString extends ClickableSpan {
private View.OnClickListener mListener;
public ClickableString(View.OnClickListener listener) {
mListener = listener;
}
@Override
public void onClick(View v) {
mListener.onClick(v);
}
}
示例:
private void spannableStringTEST()
{
String text = "SOME TEXT! HELLO! YEA";
String text2 = "Some other text.";
// Links
SpannableString link = makeLinkSpan("YOUR CLICKABLE TEXT", new View.OnClickListener() {
@Override
public void onClick(View v) {
// respond to click
Toast.makeText(mContext, "IT WORKS", Toast.LENGTH_SHORT).show();
//Intent intent = new Intent(Intent.ACTION_VIEW, "http://www.google.com");
//context.startActivity(intent);
}
});
TextView text = findViewByID(R.id.tv_cardView_text);
text .setText(text);
text .append(link);
text .append(text2);
makeLinksFocusable(text);
}
我的 xml 文本视图:
<TextView
android:id="@+id/tv_cardView_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
希望你能用它做点什么!