3

的我有在中心具有簡單不確定進度條,這我使用來顯示網絡活動的對話片段顯示():的Android DialogFragment不表示當調用的onCreate活動

public class NativeLoadingDialogFragment extends DialogFragment { 

public NativeLoadingDialogFragment() { 
    // Blank 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog dialog = new Dialog(getActivity(), android.R.style.Theme_Dialog); 
    ProgressBar indeterminateProgressBar = new ProgressBar(getActivity()); 
    indeterminateProgressBar.setIndeterminate(true); 

    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setCancelable(false); 
    dialog.setCanceledOnTouchOutside(false); 
    dialog.setContentView(indeterminateProgressBar); 

    dialog.getWindow().setBackgroundDrawable(
      new ColorDrawable(android.graphics.Color.TRANSPARENT)); 

    return dialog; 
} 

public boolean isShowing() { 
    return getDialog() != null; 
} 
} 

我已經使用了對話框片段在整個我的應用程序沒有問題,它顯示沒有問題在很多地方,當我打電話dialog.show(getFragmentManager, null),但是當我嘗試在我的設置活動onResume調用它不顯示!

我有一個設置的活動,它啓動系統設置來更改手機的語言。一旦用戶改變了語言和我的活動恢復我發現如果語言發生了變化,並做了網絡呼叫:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    mLoading = new NativeLoadingDialogFragment(); 
    if (savedInstanceState != null) { 
      if (savedInstanceState.containsKey(EXTRA_LANGUAGE)) { 
       String language = savedInstanceState.getString(EXTRA_LANGUAGE); 
       String currentLanguage = AppUtils.getDefaultLanguageCode(
         SmartBankConstant.DEFAULT_LANGUAGE, 
         SmartBankConstant.SUPPORTED_LANGUAGES); 
       if (!language.equals(currentLanguage)) { 
        updateLanguage(Language.stringToLanguage(currentLanguage)); 
       } 
      } 
     } 
    } 

    private void updateLanguage(Language newLanguage) { 
    .... 
    getSpiceManager().execute(new SetLanguageRequest(newLanguage), 
      new SetLanguageRequestListener(this)); 

     mLoading.show(getFragmentManager(), null); 
     getFragmentManager().executePendingTransactions(); 
    } 

代碼絕對運行,但沒有出現對話框!如果網絡呼叫失敗,我有一個重試選項,再次調用updateLanguage(Language newLanguage)方法,並且該對話框實際上顯示該時間!我究竟做錯了什麼?

+1

在我看來,你只是調用'show()'方法一次,也就是說'updateLanguage()'方法。在第一次運行時,'language.equals(currentLanguag))'檢查成功,所以不調用updateLanguage()。 – Sebastiano

回答

0

試試這種方法。它檢查對話框是否已經顯示,否則顯示它。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    mLoading = new NativeLoadingDialogFragment(); 
    if (savedInstanceState != null) { 
     ... 
    } 

    mLoading.show(getFragmentManager(), null); 
} 

private void updateLanguage(Language newLanguage) { 
    ... 

    if (mLoading != null && !mLoading.isVisible()) { 
     mLoading.show(getFragmentManager(), null); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 
0

我不知道爲什麼,但在下一個循環中運行片段事務有助於解決此問題。

new Handler().post(new Runnable() { 
    @Override public void run() { 
     // for some reason this must be called in the next loop 
     dialogFragment.show(getSupportFragmentManager(), tag); 
    } 
}); 
相關問題