2017-09-20 93 views
0

我經常需要來自不是Activity或Fragment的子類的自定義類的用戶交互(對話框)。以下是我目前正在做這件事的一個例子。我從創建自定義類的片段的片段管理器中打開對話框,然後使用一個小的內部類作爲目標,以便獲得對話結果。這使所有相關的代碼在一個地方,而不是在父片段將onActivityResult:自定義類中的對話框在Android中崩潰O

09-20 14:06:12.852 24301-24301/com.bizname.appname E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.bizname.appname, PID: 24301 
    java.lang.IllegalStateException: Fragment ALAlert{1ace4cd #8 confirmDelete} declared target fragment DocumentViewerAlertListener{7e21182} that does not belong to this FragmentManager! 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1209) 
     at android.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1549) 
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1611) 
     at android.app.BackStackRecord.executeOps(BackStackRecord.java:807) 
     at android.app.FragmentManagerImpl.executeOps(FragmentManager.java:2394) 
     at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2189) 
     at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2142) 
     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2049) 
     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:718) 
     at android.os.Handler.handleCallback(Handler.java:789) 
     at android.os.Handler.dispatchMessage(Handler.java:98) 
     at android.os.Looper.loop(Looper.java:164) 
     at android.app.ActivityThread.main(ActivityThread.java:6541) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

public class DocumentViewer extends RelativeLayout { 

    public void deleteAnnotations() { 
     DialogFragment dialog = new DialogFragment(); 
     Bundle args = new Bundle(); 
     args.putString("title", this.app.getString(R.string.DELETE_ANNOTATIONS)); 
     args.putString("message", this.app.getString(R.string.CONFIRM_DELETE_ANNOTATIONS)); 
     args.putString("button1Text", this.app.getString(R.string.BUTTON_DELETE)); 
     args.putString("button2Text", this.app.getString(R.string.BUTTON_CANCEL)); 
     dialog.setArguments(args); 
     DocumentViewerAlertListener listener = new DocumentViewerAlertListener(); 
     listener.canvas = this.canvas; 
     dialog.setTargetFragment(listener, R.id.confirmDelete); 
     dialog.show(this.fragment.getFragmentManager(), "confirmDelete"); 
    } 

    public static class DocumentViewerAlertListener extends ALFragment { 
     public ALCanvas canvas; 

     @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 
      if ((requestCode == R.id.confirmDelete)&&(resultCode == 1)) { 
       this.canvas.clearItems(); 
      } 
     } 
    } 

} 

不幸的是,在Android的O,在dialog.show符合該堆棧跟蹤崩潰

這是有道理的,我使用的片段管理器不知道這個內部類,但有什麼選擇?我試着用內部類的片段經理...

dialog.show(listener.getFragmentManager(), "confirmDelete"); 

...並沒有崩潰,但是對話沒有出現,也許是因爲從不顯示聽者片段。

我願意爲我目前的方法進行快速修復,或者完成相同事情的其他方法(但希望快速修復!)。

回答

0

在寫出問題時,我有一個基於「聽衆片段從不顯示」的想法。我顯示的對話框前加入這一行:

this.fragment.getFragmentManager().beginTransaction().add(listener, "confirmDelete").commit(); 

我認爲這讓片段經理知道我的聽衆片段,所以它不會拋出異常。

這似乎是一個簡單而合乎邏輯的修復方法,但我仍然接受其他方法。