4

ネットワーク アクティビティを表示するために使用する、単純な不確定な進行状況バーが中央にあるダイアログ フラグメントがあります。

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)メソッドを再度呼び出す再試行オプションがあり、そのときにダイアログが実際に表示されます! 私は何を間違っていますか?

4

2 に答える 2

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();
   }
}
于 2014-03-24T17:35:51.710 に答える