2017-02-05 17 views
0

後崩潰,當我轉動我的設備而呈現出DialogFragment,我的應用程序崩潰:應用中展示DialogFragment旋轉

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.myapp, PID: 27909 
java.lang.RuntimeException: Unable to destroy activity {com.myapp/com.myapp.FileListActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4203) 
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4221) 
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4495) 
    at android.app.ActivityThread.-wrap19(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1483) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6126) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
    Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493) 
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511) 
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638) 
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:617) 
    at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:201) 
    at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:167) 
    at com.myapp.ActionsDialogFragment.onDestroy(ActionsDialogFragment.java:127) 
    at android.support.v4.app.Fragment.performDestroy(Fragment.java:2202) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1196) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1234) 
    at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:2083) 
    at android.support.v4.app.FragmentController.dispatchDestroy(FragmentController.java:244) 
    at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:368) 
    at android.support.v7.app.AppCompatActivity.onDestroy(AppCompatActivity.java:203) 
    at com.myapp.FileListActivity.onDestroy(FileListActivity.java:1106) 
    at android.app.Activity.performDestroy(Activity.java:6881) 
    at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1154) 
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4190) 
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4221)  
    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4495)  
    at android.app.ActivityThread.-wrap19(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1483)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:154)  
    at android.app.ActivityThread.main(ActivityThread.java:6126)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  

這是我DialogFragment:

public class ActionsDialogFragment extends DialogFragment { 

    public interface ActionsDialogListener { 
     void onActionSelected(DialogFragment dialog, int position); 
    } 

    AlertDialog dialog; 
    ActionsDialogListener mListener; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (ActionsDialogListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement ActionsDialogListener"); 
     } 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     dialog = builder.create(); 
     return dialog; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.actions_dialog, container, false); 

     CustomListAdapter cla; 
     cla = new CustomListAdapter(getActivity()); 
     ListView list = (ListView) view.findViewById(R.id.listViewActions); 
     final AlertDialog finalDialog = dialog; 
     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       mListener.onActionSelected((DialogFragment) getParentFragment(), position); 
       Log.d(FileListActivity.TAG, "Dismissing dialog"); 
//    ActionsDialogFragment.this.dismiss(); 
       finalDialog.dismiss(); 
      } 
     }); 
     list.setAdapter(cla); 
     dialog.setView(view); 
     return view; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d(FileListActivity.TAG, "ActionDialogFragment onDestroy()"); 
     dismiss(); 
//  dialog.dismiss(); 
    } 

    class CustomListAdapter extends ArrayAdapter<String> { 
    ... 
    } 

} 

錯誤說「無法執行此操作在onSaveInstanceState之後「。但我不知道InstanceState的保存位置。對我來說,可以關閉對話框並在旋轉後重新創建對話框。

任何想法發生了什麼問題?

編輯:

我DialogFragment在這樣的主要活動產生:

void showActionsDialog() { 
    actionsDialog = new ActionsDialogFragment(); 
    actionsDialog.show(getSupportFragmentManager(), "ActionsDialogFragment"); 
} 

編輯2:

以防萬一,這一點很重要。這是我的主要活動的onDestroy()方法:

public void onDestroy() { 
    super.onDestroy(); 
    Log.d(TAG, "FileListActivity onDestroy()"); 
    if (exifReadingDialog != null) { exifReadingDialog.dismiss(); } 
    dataFragment.mRetainedCache = mMemoryCache; 
    dataFragment.setData(mediaFolder); 
} 

編輯3:

一些額外的想法:在這裏計算器很多人說,你應該在一個DialogFragment請使用onCreateDialogonCreateView。也許這是我的問題。但是,如果我刪除onCreateDialogdialog變量,解僱不再有效。到目前爲止,我使用此解決方案:Cannot get DialogFragment to dismiss programatically(只是關閉對話框,但拍擊旋轉)

回答

0

同時,我已經嘗試了很多東西。我將ActionsDialogFragment更改爲this tutorial

但我認爲真正的錯誤是在我的自定義ListAdapter。我改變了這部分

public @NonNull View getView(int position, View view, @NonNull ViewGroup parent) { 
    LayoutInflater inflater = getLayoutInflater(null); 

public @NonNull View getView(int position, View view, @NonNull ViewGroup parent) { 
    LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 

現在我可以解僱DialogFragment簡單​​和應用程序不轉動之後再崩潰。

所以我應該在我的問題中發佈完整的課程。還是要謝謝你的幫助!

1

我認爲這個問題SI說的onDestroy調用片段事務提交的父活動和onSavedInstance有在此之後不能做被調用並且在onDestroy之前完成。你真的需要解僱onDestroy()嗎?

+0

如果我不解僱,我得到這個錯誤:'E/WindowManager:android.view.WindowLeaked:Activity com.myApp.FileListActivity泄漏了原來在此處添加的DecorView @ 2b05e78 []的窗口' – MaxGyver

+0

然後執行它onPause而不是onDestroy – FrankMonza

+0

你的意思是'public void onPause(){super.onPause(); dismissAllowingStateLoss(); ''在'ActionsDialogFragment'中?同樣的錯誤! – MaxGyver

1

由於Alert dialog在您的活動被破壞時正在運行,您會看到「泄漏窗口」異常。當活動被銷燬

你應該解僱對話框試試這個:

@Override 
protected void onDestroy() { 
    try { 
     if (dialog!= null && dialog.isShowing()) { 
      dialog.dismiss(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    super.onDestroy(); 
} 

而且在setOnItemClickListener關閉對話框第一

list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      if (finalDialog != null && finalDialog.isShowing()) { 
        finalDialog.dismiss(); 
      } 
      mListener.onActionSelected((DialogFragment) getParentFragment(), position); 
      Log.d(FileListActivity.TAG, "Dismissing dialog"); 
    //  ActionsDialogFragment.this.dismiss(); 
     } 
    }); 
+0

我的代碼中沒有'FragmentTransaction.commit()'。我已經添加了創建我的DialogFragment的函數到我的問題。我試圖將'dismiss();'改爲'dismissAllowingStateLoss();'但沒有成功。如果我使用你的示例代碼而不是'actionsDialog.show(getSupportFragmentManager(),「ActionsDialogFragment」);'從我的代碼中,應用程序仍然崩潰,類似的錯誤:java.lang.RuntimeException:無法銷燬活動{com。 myApp/com.myApp.FileListActivity}:java.lang.IllegalStateException:活動已被銷燬。 – MaxGyver

+0

檢查編輯的答案 – rafsanahmad007

+0

我已經嘗試過(它幾乎與我之前嘗試的相同),它給了我最後一條評論的錯誤。我想現在的問題是,我的'ActionsDialogFragment'在其onDestroy()方法中被解散了。如果我刪除'dismissAllowingStateLoss();',我會從FrankMonza的回答(「Activity has leaked window」)的評論中得到錯誤。 – MaxGyver