【问题标题】:Not Returning to App After Following Link关注链接后未返回应用程序
【发布时间】:2016-01-27 10:08:46
【问题描述】:

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

这很有效,允许用户打开邮件链接、电话链接和其他任何东西。

问题是当他们点击链接时它会关闭我的应用程序,所以如果他们从手机或电子邮件点击返回,它会将他们带回主屏幕而不是我的应用程序。

据我所知,当由于某种原因单击链接时,会调用 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;
    }
});

只是为了发短信,我使用了一个静态电话号码。之后这仍然不会让我回到我的应用程序。

【问题讨论】:

  • 您可能应该将其更改为打开链接的意图,如果这不起作用,那么 startActivityForResult() 可能会这样做,因为它会期望收到一些东西。
  • 我会使用静态点击意图来打开电子邮件或电话,但每个用户的数据都会有所不同。所以我不能只用链接制作一个静态视图。我错过了什么吗?
  • 遵循 Cody 建议的第一部分。那应该行得通。不管是什么,都不需要制作“静态视图”。
  • @theshadow124 你能提供更多你的代码吗?我也不明白您所说的“静态视图”是什么意思。如果您担心文本会发生变化,那也没关系。
  • 当我说静态视图时...我应该说专用。我有一个视图,然后我使用用户设置的 HTML 数据加载。可能有很多链接。如何在 textview 上设置意图以打开多种不同类型的链接?

标签: android android-activity hyperlink


【解决方案1】:

从您的上一条评论看来,您可能会在一个文本视图中包含多个链接。如果是这种情况,那么您需要使用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

希望这一切都不会太混乱。如果您还有其他问题,请告诉我。

【讨论】:

  • 太棒了。生病尝试修改代码。我用示例字符串对我的问题进行了编辑
  • 我找到了一种方法来覆盖 MovmentMethod 以使用我自己的,这样我就可以使用一个意图,但这导致了同样的事情(见主帖编辑)
  • 您不必制作自定义移动方法。如果您有任何需要执行的特殊意图操作,则可以在我提供给您的代码中,在 clickableSpan 的声明中执行,其中正在创建意图。
  • 原来它与链接无关......在某些时候我在应用程序关闭时破坏了一些东西......所以即使切换应用程序现在也会这样做。或回家然后重新打开应用程序。我看看我能不能解决这个问题
  • 完全是我的错……忘了一个“!”在退出条件下,因此它在不应该进入后台时退出。我应该删除问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 2014-05-14
  • 2022-07-30
相关资源
最近更新 更多