2016-07-08 11 views
1

문자열의 부분 문자열에 clickablespan을 설정하고 onClick에 대화 상자 단편을 표시합니다.ClickableSpan이 순환 게재 활동을 유지하지 않습니다.

처음 텍스트를 클릭하면 dialogfragment가 정상적으로 표시됩니다. 대화 상자를 닫은 후 화면을 회전하고 텍스트를 다시 클릭하면 IllegalStateException: Activity has been destroyed이 표시됩니다.

디버깅 할 때 활동이 null임을 발견했습니다.

이 내 코드입니다 :

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

스택 트레이스 :

나는 그것을 위해 임시 수정의 어떤 종류가하십시오 this is a bug 것을 발견했지만
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) 

?

답변

0

당신이 바로 버그가 있습니다. 자식 FragmentManageractivity에서 분리 될 때 깨진 내부 상태로 끝납니다. 하지만 간단하게 전화하면 FragmentonDetach을 사용하여 문제를 해결할 수 있습니다.

@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); 
    } 
} 
+0

감사합니다. 실제로 사용해 보았지만 작동하지 않았습니다. – X09

+0

@Ozuf 이것을 사용하여 다른 오류나 같은 오류가 발생했습니다. – Ironman

+0

마치 그것을 시도하지 않은 것입니다. 나는이 질문을 게시하기 오래 전에 그것을 시도했다. 이 답변은 원래 Marcus Forsell Stahre http://stackoverflow.com/a/15656428/6181476에 의해 제공되었음을 압니다. 하지만 그 솔루션은 그것이 나를 위해 작동하지 않았기 때문에 'ClickableSpan'의 경우에 대한 솔루션이라고 생각하지 않습니다. – X09