6

Tôi hiện có một TextView với một số số điện thoại HTML và url.Cách bắt ngoại lệ (ActivityNotFoundException) trong khi sử dụng LinkMovementMethod

tôi đã nhận thấy rằng chúng tôi có thể sử dụng setMovementMethod để làm cho các liên kết có thể click:

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

này hoạt động khá tốt, nhưng trên một số thiết bị, nó sụp đổ với ActivityNotFoundException và đó là khá understanble. (xem mã bên dưới)

Các sự cố này xuất hiện trong bảng điều khiển dành cho nhà phát triển của tôi và tôi không thể tạo lại chúng.

Vấn đề lớn tôi phải đối mặt là tôi không thể thử/code catch trong hoạt động của tôi như nhấp chuột được xử lý bởi LinkMovementMethod

Bất kỳ ý tưởng về làm thế nào tôi có thể tránh các lỗi như vậy?

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) 

Trả lời

18

Bạn luôn có thể mở rộng LinkMovementMethod và bắt lỗi ở đó.

Cái gì như:

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

} 

Sẽ hiển thị một thông báo lỗi trong trường hợp đó không có cài đặt ứng dụng để xử lý các ý định.

Một tùy chọn khác là sử dụng phương pháp trong this question để xác định trước thời hạn nếu mọi thứ được chuẩn bị để xử lý các liên kết của bạn.

+0

Chưa được thử nghiệm nhưng chắc chắn âm thanh như một câu trả lời hoàn hảo! Đã chấp nhận câu trả lời! –

+3

Sử dụng nó như sau: - setMovementMethod (new MovementCheck()); – David

+0

Hoặc sử dụng nó như thế này.Thêm: \t riêng tư tĩnh MovementCheck sInstance; \t public static MovementCheck getInstance() { \t \t if (sInstance == null) \t \t \t sInstance = new MovementCheck(); \t \t trả về sInstance; \t} Ngoài ra, ngữ cảnh có thể được obained từ TextView: widget.getContext(); – Yar

0

Nếu textview nguồn gốc của bạn là xml bạn có thể thử một sản phẩm được xác định here.
Maby (Tôi gần như chắc chắn về nó.) nhưng hệ điều hành sẽ xử lý điều này cho bạn.

Nếu điều này không hoạt động, khi đó bạn phải viết mã độc lập thiết bị cho máy tính bảng và điện thoại. Trong trường hợp này, bạn cần this bài viết hướng dẫn bạn. Khi điện thoại của nó, bạn sẽ cho phép liên kết và những người khác bạn không muốn.

Maby chia 2 liên kết trong 2 TextView vì os có thể một trong hai cách làm một trong những liên kết (trang web) thats cách nó prob làm cho nó nhấp được và bị treo khi bạn cố gắng nhấp vào phonenumber một

Hope this helps .

+0

Tai nạn khác cũng được cài đặt trong xml và nó cũng gặp sự cố trên một số điện thoại (thậm chí là sự cố url) –

+0

Bạn đã thử kiểm tra loại thiết bị chưa? –

+0

hoặc maby phân tách số điện thoại và url trong 2 bản xem trước –

Các vấn đề liên quan