如何同时使用LinkMovementMethod捕捉异常(ActivityNotFoundException) [英] How to catch an Exception (ActivityNotFoundException) while using LinkMovementMethod

查看:457
本文介绍了如何同时使用LinkMovementMethod捕捉异常(ActivityNotFoundException)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前是用HTML的电话号码和网址。

的TextView

我注意到,我们可以使用setMovementMethod使这些链接点击:

  tv.setText(电话号码是:32485123456 url是http://www.blabla.com);
tv.setMovementMethod(LinkMovementMethod.getInstance());

这工作pretty很好,但在某些设备上,它ActivityNotFoundException崩溃,那​​是相当understanble。 (见code以下)

这些问题出现在我的开发者控制台,我不能复制它们。

我现在面临的最大问题是,当点击由LinkMovementMethod处理,我不能try / catch语句code在我的活动

我如何能避免这样的错误任何想法?

  android.content.ActivityNotFoundException:无活动处理意向{行动= android.intent.action.VIEW DAT = www.vlaamsbrabant.be /赛雷欧(有临时演员)}
    在android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408)
    在android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
    在android.app.Activity.startActivityForResult(Activity.java:2817)
    在android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
    在android.app.Activity.startActivity(Activity.java:2923)
    在android.text.style.URLSpan.onClick(URLSpan.java:62)
    在android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:216)
    在android.widget.TextView.onTouchEvent(TextView.java:6788)
    在android.view.View.dispatchTouchEvent(View.java:3766)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1896)
    在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1159)
    在android.app.Activity.dispatchTouchEvent(Activity.java:2086)
    在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1880)
    在android.view.ViewRoot.handleMessage(ViewRoot.java:1811)
    在android.os.Handler.dispatchMessage(Handler.java:99)
    在android.os.Looper.loop(Looper.java:123)
    在android.app.ActivityThread.main(ActivityThread.java:4627)
    在java.lang.reflect.Method.invokeNative(本机方法)
    在java.lang.reflect.Method.invoke(Method.java:521)
    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)
    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    在dalvik.system.NativeStart.main(本机方法)


解决方案

您可以永远只是延长LinkMovementMethod,赶上的错误。

是这样的:

 私有类MovementCheck扩展LinkMovementMethod {    @覆盖
    公共布尔onTouchEvent(TextView的小部件,Spannable缓冲,MotionEvent事件){
        尝试{
            返回super.onTouchEvent(小部件,缓冲,事件);
        }赶上(例外前){
            Toast.makeText(MainActivity.this,无法加载链接,Toast.LENGTH_LONG).show();
            返回true;
        }
    }}

将在情况下显示的错误消息没有应用程序安装到处理这个意图。

另一种选择是使用这个问题提前确定时间如果有什么是prepared来处理你的链接。

I have currently a TextView with some HTML phone numbers and url.

I have noticed that we can use the setMovementMethod to make these links clickable:

tv.setText("Phone number is: +32485123456 and url is http://www.blabla.com");
tv.setMovementMethod(LinkMovementMethod.getInstance());

This works pretty well, but on some devices, it crash with ActivityNotFoundException and that is quite understanble. (see code below)

These problems appear in my developer console and I cannot reproduce them.

The big problem I am facing is that I cannot try/catch code in my activity as the click is handled by LinkMovementMethod

Any idea on how I can avoid such errors?

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.vlaamsbrabant.be/zoutleeuw (has extras) }
    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
    at android.app.Activity.startActivityForResult(Activity.java:2817)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
    at android.app.Activity.startActivity(Activity.java:2923)
    at android.text.style.URLSpan.onClick(URLSpan.java:62)
    at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:216)
    at android.widget.TextView.onTouchEvent(TextView.java:6788)
    at android.view.View.dispatchTouchEvent(View.java:3766)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1896)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1159)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1880)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1811)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    at dalvik.system.NativeStart.main(Native Method)

解决方案

You can always just extend LinkMovementMethod and catch the error there.

Something like:

private class MovementCheck extends LinkMovementMethod {

    @Override
    public boolean onTouchEvent( TextView widget, Spannable buffer, MotionEvent event ) {
        try {
            return super.onTouchEvent( widget, buffer, event ) ;
        } catch( Exception ex ) {
            Toast.makeText( MainActivity.this, "Could not load link", Toast.LENGTH_LONG ).show();
            return true;
        }
    }

}

Will display an error message in the case that there is no application setup to handle the intent.

Another option is to use the method in this question to determine ahead of time if anything is prepared to handle your links.

这篇关于如何同时使用LinkMovementMethod捕捉异常(ActivityNotFoundException)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆