Гиперссылка в AlertDialog завершается с ошибкой ActivityNotFoundException

Я пытаюсь что-то простое. Включите гиперссылку в сообщение 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 я добавил intend-фильтр 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

Что не так?

2 ответа

Вам нужно позвонить в веб-браузер пользователя, чтобы открыть его, или позвонить в веб-браузер, чтобы открыть его в приложении. У вас нет ничего закодированного, чтобы покрыть это.

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");

Если я использую 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:

Проверьте эту ссылку

Конечно, он должен показывать это без HTML-тегов, как это -> Проверить эту ссылку...


Итак, вот окончательное решение для получения хорошо отформатированных гиперссылок внутри 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) в наш класс. В противном случае сгенерированный URL будет неправильным, если мы будем использовать только Linkify.addLinks(TextView textView, Pattern pattern, String схема).

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 "";
            }
        });
    }

Итак, это делает его действительно удобным!:)

Другие вопросы по тегам