关注链接

时间:2015-10-27 20:03:40

标签: android android-activity hyperlink

内容从服务器传送到我的应用程序,有时内容包含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;
    }
});

我只使用静态电话号码。这仍然没有让我回到我的应用程序之后。

1 个答案:

答案 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

希望一切都不会让人感到困惑。如果您有更多问题请告诉我。