3

在我的應用程序的活動,我需要顯示「加載」 uncancelable FragmentDialog而東西上傳。我顯示來自回調該對話框中我目前的活動是這樣的:這是從我的UI分段執行辭退一個DialogFragment(支持庫),而活動的背景變得IllegalStateException異常

final FragmentManager fm = getSupportFragmentManager(); 
final FragmentTransaction ft = fm.beginTransaction(); 
final Fragment prev = fm.findFragmentByTag("loading"); 
if (prev != null) { 
    ft.remove(prev); 
} 
ft.addToBackStack(null); 
final DialogFragment df = 
     IndeterminateProgressDialogFragment.newInstance(
     getString(R.string.loading_dialog_sending_data)); 
df.setCancelable(false); 
df.show(ft, "loading"); 

上傳是在保留片段發生(使用的AsyncTask)。上傳完成後,我的ui Fragment會通知onActivityResult,並且當前它會嘗試關閉對話框。過去,它委託負責解除加載對話框的onActivityResult回調,但它不起作用。

而我的活動是在前臺,我可以關閉此對話框,但如果是在後臺,我得到一個IllegalStateException:不能執行onSaveInstaneState後這個動作。我嘗試使用onRemove,這不會讓我的應用程序崩潰,但也不會隱藏DialogFragment。我已經在我的碎片和我的活動上做了兩件事情,但仍然遇到了問題。

我一直在閱讀的文檔,但我不能找到一些方法,我可以使用。

是DialogFragment不應該被使用,正如我需要還是什麼,應該怎麼辦?

回答

2

我只是設法用髒的解決方法來解決這個問題:

我趕上IllegalStateException異常和標誌設置爲true,所以當我的片段回來,我知道我想解僱。

//All this code is inside my ui Fragment 
@Override 
public void onResume() { 
    super.onResume(); 
    final boolean kill = getArguments().getBoolean(ARG_KILL_LOADING, false); 
    if (kill) { 
     final DialogFragment df = (DialogFragment) 
       getFragmentManager().findFragmentByTag("loading"); 
     if (df != null) { 
      df.dismiss(); 
     } 
    } 
} 


//Here I got workerfragment result and try to dismiss my DialogFragment 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    try { 
     final DialogFragment df = (DialogFragment) getFragmentManager().findFragmentByTag("loading"); 
     if (df != null) { 
      df.dismiss(); //Let's throw an IllegalStateException if on background! 
     } 
    } catch(IllegalStateException ex) { 
     //dirty way to avoid crashing while on background: 
     //we will ask our ui fragment to dismiss df when ui fragment comes back onResume 
     getArguments().putBoolean(ARG_KILL_LOADING, true); 
    } 

//Do something on ui with workerfragment result 

} 

但我仍然想知道什麼是在onBackground時關閉FragmentDialog的正確方法。我得到了同樣的問題的另一個項目:/

2

你不需要在onActivityResult和捕獲異常解僱片段。

只需設置你標誌onActivityResult。我使用靜態變量。

public class MyFragment extends DialogFragment { 
      private static boolean KILL_FLAG = false; 

      @Override 
      public Dialog onCreateDialog(Bundle savedInstanceState) { 
       KILL_FLAG = false; 
      } 

      @Override 
      public void onActivityResult(int requestCode, int resultCode, 
      Intent data) { 
        KILL_FLAG = true; 
      } 

      @Override 
      public void onResume() { 
       super.onResume(); 

       if(KILL_FLAG){ 
        dismiss(); 
       } 
      } 
    } 
+0

但是,然後我的片段對話框應該是我保留的片段(在背景上做這個工作的)的目標,我的對話框將結果傳遞給我的UI片段。我對嗎? – Platonius

+0

您是否只爲顯示等待/加載對話框執行此操作?你爲什麼使用onActivityResult?我對嗎? – garmax1

+0

是的,我喜歡。使用onActivityResult,我從我的工作片段中得到結果,所以我可以知道上傳是否成功。 – Platonius

相關問題