【问题标题】:Hyperlink in AlertDialog crashes with ActivityNotFoundExceptionAlertDialog 中的超链接因 ActivityNotFoundException 而崩溃
【发布时间】:2015-11-18 12:01:41
【问题描述】:

我正在尝试一些简单的事情。在 AlertDialog 消息中包含超链接。我可以包含超链接,并根据需要将其绘制为超链接。但是当点击它时,应用程序崩溃了:

ActivityMain.java

AlertDialog ad = new AlertDialog.Builder(this).create();
        ad.setMessage(Html.fromHtml("<a href=\\\"http://www.google.com\\\">Check this link out</a>));
        ad.setButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        ad.show();
        TextView textView = (TextView) ad.findViewById(android.R.id.message);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
        textView.setMovementMethod(LinkMovementMethod.getInstance());

在我的 AndroidManifext.xml 中,我添加了 intent-filter android.intent.action.VIEW,但它仍然崩溃。

        <activity
            android:name="org.app.test"
            android:screenOrientation="portrait"
            android:label="@string/app_name"
            android:theme="@style/AppTheme"
            >

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Logcat 错误信息

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=\"http://www.google.com\" (has extras) }
            at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1672)
            at android.app.Instrumentation.execStartActivity(Instrumentation.java:1442)
            at android.app.Activity.startActivityForResult(Activity.java:3511)
            at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
            at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:631)
            at android.app.Activity.startActivityForResult(Native Method)
            at android.app.Activity.startActivityForResult(Activity.java:3472)
            at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
            at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:631)
            at android.app.Activity.startActivityForResult(Native Method)
            at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:748)
            at android.app.Activity.startActivity(Activity.java:3714)
            at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
            at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:631)
            at android.app.Activity.startActivity(Native Method)
            at android.app.Activity.startActivity(Activity.java:3682)
            at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
            at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:631)
            at android.app.Activity.startActivity(Native Method)
            at android.content.ContextWrapper.startActivity(ContextWrapper.java:323)
            at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
            at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:631)
            at android.content.ContextWrapper.startActivity(Native Method)
            at android.text.style.URLSpan.onClick(URLSpan.java:62)
            at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:217)
            at android.widget.TextView.onTouchEvent(TextView.java:9180)
            at android.view.View.dispatchTouchEvent(View.java:8107)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2411)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2144)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2411)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2144)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2411)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2144)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2411)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2144)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2411)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2144)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2411)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2144)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2280)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1615)
            at android.app.Dialog.dispatchTouchEvent(Dialog.java:757)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2228)
            at android.view.View.dispatchPointerEvent(View.java:8315)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4596)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4464)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4022)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4076)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4045)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4156)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4053)
            at android.view.ViewRootImpl$Async

怎么了?

【问题讨论】:

    标签: android hyperlink android-alertdialog intentfilter activitynotfoundexception


    【解决方案1】:

    您需要调用用户的网络浏览器来打开它,或者调用 webview 来在应用程序中打开它。你没有任何代码来覆盖它。

    WebView webview = new WebView(this);
    setContentView(webview);
    webview.loadUrl(www.google.com);
    

    以上内容适用于应用内。 拉取用户网络客户端:

    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    webview.getSettings().setJavaScriptEnabled(true);
    final Activiy activity = this;
    webview.setWebChromeClient(new WebChromeClient() {
    
    
    public void onProgressChanged(WebView view, int progress) {
         activity.setProgress(progress * 1000);
       }
     });
     webview.setWebViewClient(new WebViewClient() {
       public void onReceivedError(WebView view, int errorCode, String  description, String failingUrl) {
         Toast.makeText(activity, "Oh no! " + description,     
        Toast.LENGTH_SHORT).show();
           }
         });
        webview.loadUrl("www.google.com");
    

    【讨论】:

    • 好的,可以举个例子吗?
    • 你想做什么?这是一件大事。我假设在应用程序中?
    • 是的,它是一个安卓应用。我只想将超链接添加到我的 AlertDialog 以便在智能手机默认浏览器(很可能是 Chrome)中单击时打开 URL。它不应该是一件大事......只是一个小的警报对话框。我不想为此或更大的东西创建自己的活动......
    • 在脚本开头添加 import android.webkit.WebView,确保添加互联网使用权限,因为我在您的脚本中没有看到,您仍然需要调用新的网页浏览。所有这些都在 onCreate()
    • 我想避免使用 webview,因为它会产生很多开销...当然设置了 Internet 权限&lt;uses-permission android:name="android.permission.INTERNET"/&gt;。我想用 AlertDialog 来做。链接已经画好了,只是想摆脱那个错误...
    【解决方案2】:

    如果我使用 Linkify,链接可以正常点击并在网络浏览器中打开。

    String msg = "<a href=\"http://www.google.com\">Check this link out</a>";
    
    final SpannableString s = new SpannableString(msg);
    Linkify.addLinks(s, Linkify.ALL);
    
    AlertDialog ad = new AlertDialog.Builder(this)
                            .setMessage(s)
                            .setTitle("Click a link in AlertDialog")
                            .setIcon(android.R.drawable.ic_dialog_info)
                            .create();
    
    TextView textView = (TextView) ad.findViewById(android.R.id.message);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    

    这就是我想要实现的几乎...但是链接没有正确呈现...:(

    这是它打印到我的 AlertDialog 中的结果:

    http://www.google.com\">查看此链接

    当然它应该在没有 HTML 标记的情况下显示它,像这样 -> Check this link out ...


    所以这是最终解决方案,可以在 AlertDialogs 中获得格式正确的超链接而不会出现任何错误:

        String msg = "Check this link out, and I will send you to Google.";
    
        AlertDialog ad = new AlertDialog.Builder(this)
                .setTitle("Open a Hyperlink inside AlertDialog")
                .setMessage(msg)
                .setIcon(android.R.drawable.ic_dialog_info)
                .create();
    
        ad.show();
    
        TextView message = (TextView) ad.findViewById(android.R.id.message);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        addLinks(message , "Check this link out", "http://www.google.com");
    

    我们唯一需要做的就是在我们的类中添加一个小的新函数addLinks(Textview, String, String)。否则当我们只使用 Linkify.addLinks(TextView textView, Pattern pattern, String scheme) 时生成的 URL 会出错。

    public static void addLinks(TextView textView, String linkThis, String toThis)
        {
            Pattern pattern = Pattern.compile(linkThis);
            String scheme = toThis;
            Linkify.addLinks(textView, pattern, scheme, new Linkify.MatchFilter() {
                @Override
                public boolean acceptMatch(CharSequence s, int start, int end) {
                    return true;
                }
            }, new Linkify.TransformFilter() {
    
                @Override
                public String transformUrl(Matcher match, String url) {
                    return "";
                }
            });
        }
    

    所以,这真的很舒服! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多