6

Ich habe derzeit eine TextView mit einigen HTML-Telefonnummern und URL.So fangen Sie eine Ausnahme (ActivityNotFoundException) während der Verwendung von LinkMovementMethod

ich bemerkt habe, dass wir die setMovementMethod verwenden können, um diese Links klickbar zu machen:

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

Das funktioniert ziemlich gut, aber bei einigen Geräten, es mit ActivityNotFoundException abstürzen und das ist ganz understanble. (siehe Code unten)

Diese Probleme erscheinen in meiner Entwicklerkonsole und ich kann sie nicht reproduzieren.

Das große Problem, das ich bin vor ist, dass ich nicht versuchen kann/catch-Code in meiner Tätigkeit als der Klick von LinkMovementMethod behandelt wird

Irgendeine Idee, wie ich solche Fehler vermeiden kann?

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) 

Antwort

18

Sie können LinkMovementMethod immer erweitern und den Fehler dort abfangen.

Etwas wie:

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

} 

Wird im Fall eine Fehlermeldung an, dass es kein Anwendungs-Setup ist die Absicht zu behandeln.

Eine andere Möglichkeit ist, die Methode this question zu verwenden, um im Voraus zu bestimmen, ob etwas vorbereitet ist, Ihre Links zu bearbeiten.

+0

Noch nicht getestet, klingt aber nach einer perfekten Antwort! Antwort angenommen! –

+3

Verwenden Sie es wie folgt: - setMovementMethod (new MovementCheck()); – David

+0

Oder benutze es so.Hinzufügen: \t private statische MovementCheck sInstance; \t public static MovementCheck getInstance() { \t \t if (sInstance == null) \t \t \t sInstance = new MovementCheck(); \t \t return sInstance; \t} Auch Kontext kann von TextView erhalten werden: widget.getContext(); – Yar

0

Wenn Ihr Textview seinen Ursprung in xml ist, können Sie ein aproach versuchen here definiert.
Maby (ich bin fast sicher davon.) aber wird das OS dies für Sie behandeln.

Wenn dies nicht funktioniert, müssen Sie Geräteunabhängigkeitscode für Tablets und Telefone schreiben. In diesem Fall wird maby die this Post Sie führen. Wenn es ein Telefon ist, erlauben Sie die Verknüpfung und sonst Sie nicht.

Maby trennt die 2 Links in 2 Textviews, weil das Betriebssystem so oder so eine der Link tun kann (Website) das ist so, wie es macht prob es anklickbare und stürzt ab, wenn Sie versuchen, die Telefonnummer ein

Hoffnung zu klicken, das hilft .

+0

ALe Absturz wenn in xml gesetzt ist, und es stürzt auch auf einigen Handys ab (sogar URL Absturz) –

+0

Haben Sie versucht, einen Gerätetyp zu überprüfen? –

+0

oder maby Trennung der Telefonnummer und URL in 2 Textansichten –

Verwandte Themen