内容从服务器传送到我的应用程序,有时内容包含tel:或mailto:超链接。目前我使用html.fromhtml()和setMovementMethod来使textview链接可点击:
((TextView) findViewById(R.id.c_data)).setText(Html.fromHtml(HTML_out));
((TextView) findViewById(R.id.c_data)).setMovementMethod(LinkMovementMethod.getInstance());
这样可以让用户打开mailto链接,手机链接和其他任何内容。
问题是当他们点击链接时关闭我的应用程序,所以如果他们从手机或电子邮件中单击回来,则会将他们带回主屏幕而不是我的应用程序。
从我所看到的,当出于某种原因点击链接时,onStop被调用。如何避免这种情况,以便在通话/电子邮件后立即重新打开应用程序?
示例数据:
<b>Title1</b><a href="tel:44#######">(44#) ###-####</a>
<b>Title2</b><a href="mailto:test@gmail.com">test@gmail.com</a>
<b>Title3</b><a href="google.ca">google.ca</a>
编辑: 我试图使用意图:
((TextView) findViewById(R.id.cust_data)).setText(Html.fromHtml(HTML_out));
//((TextView) findViewById(R.id.cust_data)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.cust_data)).setMovementMethod(new MovementMethod() {
@Override
public void initialize(TextView widget, Spannable text) {
//Log.i("Test click","Good");
}
@Override
public boolean onKeyDown(TextView widget, Spannable text, int keyCode, KeyEvent event) {
return false;
}
@Override
public boolean onKeyUp(TextView widget, Spannable text, int keyCode, KeyEvent event) {
//Log.i("Test click","Good");
return false;
}
@Override
public boolean onKeyOther(TextView view, Spannable text, KeyEvent event) {
//Log.i("Test click","Good");
return false;
}
@Override
public void onTakeFocus(TextView widget, Spannable text, int direction) {
}
@Override
public boolean onTrackballEvent(TextView widget, Spannable text, MotionEvent event) {
return false;
}
@Override
public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.i("Test click", text.toString());
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:0123456789"));
startActivity(intent);
return true;
} else {
return false;
}
}
@Override
public boolean onGenericMotionEvent(TextView widget, Spannable text, MotionEvent event) {
return false;
}
@Override
public boolean canSelectArbitrarily() {
return false;
}
});
我只使用静态电话号码。这仍然没有让我回到我的应用程序之后。
答案 0 :(得分:1)
从您上次的评论中,您可能会在一个textview中找到几个链接。如果是这种情况,那么您想要的是使用spannable
设置文本,这样您就可以确定其中的链接,文本内容以及其他格式(如粗体或斜体文本)只是部分文字。尝试这样的事情:
final SpannableStringBuilder content = getContent(); // This method is explained below.
final TextView textView = (TextView) findViewById(R.id.my_text_view);
textView.setLinksClickable(true);
textView.setText(content, TextView.BufferType.SPANNABLE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
getContent()
- 由于我们不知道您是如何获取链接的,因此我们会更难以给您答案。当我编写一个执行此操作的应用程序时,它正在从xml文件中提取数据,因此链接已标记在其中。我会粘贴该代码,因此您可以将其作为基础,但除非您的行为与我们完全相同,否则您必须对其进行修改以获取链接。
if (contentNode instanceof Element && contentNode.getNodeName().equals("section")) {
String sectionTitle = ((Element) contentNode).getAttribute("title");
article.headers.add(sectionTitle);
NodeList sectionList = contentNode.getChildNodes();
String text = "";
ArrayList<String> links = new ArrayList<>(), linkStrings = new ArrayList<>();
for (int k = 0; k < sectionList.getLength(); k++) {
Node sectionNode = sectionList.item(k);
if (sectionNode instanceof Element && sectionNode.getNodeName().equals("text")) {
NodeList textNodes = sectionNode.getChildNodes();
for (int l = 0; l < textNodes.getLength(); l++) {
Node attributeNode = textNodes.item(l);
text += attributeNode.getTextContent();
}
}
if (sectionNode instanceof Element && sectionNode.getNodeName().equals("embedded_link")) {
String linkDestination = ((Element) sectionNode).getAttribute("destination");
String linkString = ((Element) sectionNode).getAttribute("string");
linkStrings.add(linkString);
links.add(linkDestination);
}
} // end k forloop
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text);
// Loop through all of the links.
for (int m = 0; m < links.size(); m++) {
final String linkString = linkStrings.get(m);
final String link = links.get(m);
final int start = text.indexOf(linkString);
final int end = start + linkString.length();
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(link));
context.startActivity(i);
}
};
if (start > -1) {
try {
spannableStringBuilder.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (Exception e) {
Log.e("couldn't spannable text", linkString);
}
}
} // end m forloop
article.bodyContent.put(sectionTitle, spannableStringBuilder);
} // end if for section
希望一切都不会让人感到困惑。如果您有更多问题请告诉我。