6

का उपयोग करते समय अपवाद (ActivityNotFoundException) को कैसे पकड़ें, मेरे पास वर्तमान में कुछ HTML फ़ोन नंबर और यूआरएल के साथ एक टेक्स्ट व्यू है।LinkMovementMethod

मैं देखा है कि हम setMovementMethod उपयोग कर सकते हैं इन कड़ियों क्लिक करने योग्य बनाने के लिए:

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

यह बहुत अच्छी तरह से काम करता है, लेकिन कुछ उपकरणों पर, यह ActivityNotFoundException साथ दुर्घटना और कहा कि काफी understanble है। (नीचे कोड देखें)

ये समस्याएं मेरे डेवलपर कंसोल में दिखाई देती हैं और मैं उन्हें पुन: उत्पन्न नहीं कर सकता।

बड़ी समस्या का सामना करना पड़ रहा हूँ कि मैं अपने गतिविधि में की कोशिश नहीं कर सकते हैं/कैच कोड के रूप में क्लिक LinkMovementMethod

से मैं ऐसी त्रुटियों कैसे बच सकते हैं पर कोई विचार नियंत्रित किया जाता है है?

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) 

उत्तर

18

आप हमेशा LinkMovementMethod का विस्तार कर सकते हैं और वहां त्रुटि को पकड़ सकते हैं।

कुछ की तरह:

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

} 

मामला है कि वहाँ कोई आवेदन इरादे को संभालने के लिए सेटअप में कोई त्रुटि संदेश प्रदर्शित करेगा।

एक और विकल्प this question में विधि का उपयोग करना है ताकि समय से पहले निर्धारित किया जा सके कि आपके लिंक को संभालने के लिए कुछ भी तैयार है।

+0

अभी तक परीक्षण नहीं किया गया है लेकिन निश्चित रूप से एक सही उत्तर की तरह ध्वनि है! उत्तर स्वीकार किया गया! –

+3

इसे इस तरह प्रयोग करें: - setMovementMethod (नया मूवमेंट चेक()); – David

+0

या इसे इस तरह इस्तेमाल करें।जोड़ें: \t निजी स्थैतिक आंदोलन जांच संस्थान; \t सार्वजनिक स्थिर MovementCheck getInstance() { \t \t अगर (sInstance == नल) \t \t \t sInstance = नए MovementCheck(); \t \t वापसी संकेत; \t} इसके अलावा, टेक्स्टव्यू से संदर्भ को हटाया जा सकता है: widget.getContext(); – Yar

0

उसके मूल एक्सएमएल में है अपने TextView यदि आप एक aproach परिभाषित here कोशिश कर सकते हैं।
मैबी (मुझे इसके बारे में लगभग यकीन है।) लेकिन क्या ओएस आपके लिए इसे संभालेगा।

यदि यह काम नहीं करता है, तो आपको टैबलेट और फोन के लिए डिवाइस स्वतंत्र कोड लिखना होगा। इस मामले में, मैबी this पोस्ट आपको गाइड करेगा। जब यह एक फोन है तो आप लिंकिंग की अनुमति देंगे और अन्यथा आप नहीं करेंगे।

Maby अलग 2 textviews में 2 लिंक क्योंकि ओएस किसी भी तरह से लिंक (वेबसाइट) में से एक कर सकते हैं जिस तरह से और दुर्घटनाओं यह समस्या यह क्लिक करने योग्य बनाता है thats जब आप फ़ोननंबर क्लिक करने के लिए एक

आशा इस मदद करता है की कोशिश ।

+0

एक्सएमएल में सेट होने पर भी क्रैश होता है, और यह कुछ फोनों पर भी क्रैश होता है (यहां तक ​​कि यूआरएल क्रैश) –

+0

क्या आपने डिवाइस प्रकार की जांच करने की कोशिश की है? –

+0

या 2 टेक्स्टव्यू –