【问题标题】:ClickableSpan is not retaining activity on rotationClickableSpan 不保留旋转活动
【发布时间】:2016-11-10 17:29:00
【问题描述】:

我在字符串的子字符串上设置clickablespan,并在onClick 中显示一个对话框片段。

当我第一次单击文本时,对话框片段正常显示。关闭对话框后,我旋转屏幕并再次单击文本,它会抛出IllegalStateException: Activity has been destroyed

当我调试时,我发现活动为空。

这是我的代码:

String rawAuthor = String.format(getResources().getString(R.string.post_by), name, postDateStr); 

int i1 = rawAuthor.indexOf(" by "); 
int i2 = rawAuthor.indexOf(" on ");
postAuthorDate.setText(rawAuthor, TextView.BufferType.SPANNABLE);
postAuthorDate.setMovementMethod(LinkMovementMethod.getInstance());
postAuthorDate.setHighlightColor(ContextCompat.getColor(getActivity(), R.color.nav_bg)); 
Spannable spannable = (Spannable)postAuthorDate.getText(); 

ClickableSpan clickableSpan = new ClickableSpan() { 
   @Override public void onClick(View widget) { 
     Log.d(TAG, "I was clicked"); 
     //mOnTagCatClickedListener.OnTatCatClicked(name, authorId, "Author"); 
     TagCatFragment tagCatFragment = TagCatFragment.newInstance(name, authorId, "Author"); 

     try { 
       tagCatFragment.show(getChildFragmentManager(), "TagCAatFragment");  
     } catch (IllegalStateException e) { 
       e.printStackTrace(); 
     } 
   }
 }; 
 spannable.setSpan(clickableSpan, i1+4, i2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
 }

堆栈跟踪:

07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err: java.lang.IllegalStateException: Activity has been destroyed
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1515)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:617)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.support.v4.app.DialogFragment.show(DialogFragment.java:139)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at com.ozuf.poster.Fragment.DetailsFragment$9.onClick(DetailsFragment.java:474)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:217)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.widget.TextView.onTouchEvent(TextView.java:8464)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.View.dispatchTouchEvent(View.java:8808)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2581)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2607)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1779)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.app.Activity.dispatchTouchEvent(Activity.java:2846)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2568)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.View.dispatchPointerEvent(View.java:9003)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4209)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4072)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3627)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3680)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3646)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3763)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3654)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3820)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3627)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3680)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3646)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3654)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3627)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5910)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5884)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5855)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6000)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.os.MessageQueue.nativePollOnce(Native Method)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.os.MessageQueue.next(MessageQueue.java:143)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.os.Looper.loop(Looper.java:122)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5910)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405)
07-06 16:56:31.164 2162-2162/com.ozuf.poster W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

虽然我发现了this is a bug,请问有什么临时解决办法吗?

【问题讨论】:

    标签: android illegalstateexception clickablespan


    【解决方案1】:

    你是对的,有错误。子 FragmentManager 在与 activity 分离时最终会出现内部状态损坏。但是很简单,您可以在Fragment 中使用onDetach 来修复它。

    @Override
    public void onDetach() {
        super.onDetach();
    
        try {
            Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
            childFragmentManager.setAccessible(true);
            childFragmentManager.set(this, null);
    
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
    

    【讨论】:

    • 谢谢,我确实试过了,但没用。
    • @Ozuf 使用这个你得到任何其他错误或相同的错误。
    • 好像没试过一样。在发布这个问题之前,我已经尝试了很久。我知道这个答案最初是由 Marcus Forsell Stahre stackoverflow.com/a/15656428/6181476 给出的。但我认为解决方案不适用于ClickableSpan,因为它对我不起作用。
    • @Ozuf 你检查过这个吗?有很多解决方案有不同的问题code.google.com/p/android/issues/detail?id=42601
    • 先生,我也看过。这就是让 Marcus Forsell Stahre 在您的答案中提出临时修复的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2014-09-04
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多