在 Activity 的 onCreate 中调用 show() 时,Android DialogFragment 不显示

标签 android android-activity android-dialogfragment dialogfragment

我有一个对话 fragment ,中间有一个简单的不确定进度条,我用它来显示网络 Activity :

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;
}
}

我在整个应用程序中都使用了对话框 fragment ,没有任何问题,当我调用 dialog.show(getFragmentManager, null) 时,它在很多地方都没有问题,但是当我尝试调用它在我的设置 Activity 的 onResume 中没有显示!

我有一个设置 Activity ,它启动系统设置以更改手机的语言。一旦用户更改语言并且我的 Activity 恢复,我会检测语言是否已更改并进行网络调用:

 @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) 方法,此时对话框实际上会出现!我做错了什么?

最佳答案

试试这个方法。它检查对话框是否已经显示,否则显示它。

@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();
   }
}

关于在 Activity 的 onCreate 中调用 show() 时,Android DialogFragment 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22616397/

相关文章:

android - 从 dialogFragment 返回后 getActivity() 返回 null

android - 如何使弹出窗口大小超过对话框窗口大小?

android - 如何使用导航组件导航嵌套的 DialogFragments 而不破坏第二个?

java - Android Google Map - 错误膨胀类 fragment

android - 在整个应用程序中仅创建 1 个处理程序实例

java - 如何防止后退按钮从主要 Activity 中关闭应用程序?

java - 来自类型 new FindCallback<ParseUser>(){} 的方法 done(ParseObject, ParseException) 从不在本地使用

android - 如何跟踪 Activity 堆栈中的 Activity

java - 如果在 Java 中的局部变量范围之外使用,列表将显示为 null

android - OpenGL ES 2 与在 Canvas 上绘图 (SurfaceView) - 哪个更好?