如何在Android中防止屏幕旋转时ProgressDialog消失?

6

我有一个活动,当连接到蓝牙设备时显示进度对话框。在 ProgressDialog 显示期间屏幕方向发生变化之前,它可以正常工作。但是,当 ProgressDialog 消失后建立连接,应用程序调用 progressDialog.dismiss(); 此时应用程序崩溃,因为没有 ProgressDialog 可以解除。如何防止在屏幕方向更改时 ProgressDialog 被解除?

public void prepareViews(int ID, boolean state){
        switch(ID){
        case USERNAME_TEXTBOX:
            LoginUsernameTextBox.setEnabled(state);
            break;
        case PASSWORD_TEXTBOX:
            LoginPasswordTextBox.setEnabled(state);
            break;
        case LOGIN_BUTTON:
            LoginButton.setEnabled(state);
            break;
        case LOGIN_PROGRESSBAR:
            if(state == true){
                LoginProgressBar.setVisibility(View.VISIBLE);
                LoginProgressBar.setIndeterminate(true); }
            else{
                LoginProgressBar.setVisibility(View.GONE);
            }
            break;
        case CONNECTING_DIALOG:
            if(state == true){
            progressDialog = ProgressDialog.show(MainActivity.this, "", "Connecting", true); }
            else{
                progressDialog.dismiss();
            }
            break;
        }
    }
5个回答

8
请记住,当您旋转设备时,Android会销毁并重新创建Activities。您的问题很可能是因为progressDialog为空,因为在重新创建Activity后,该变量未被再次设置。
您需要使用DialogFragment,并牢记activity生命周期。您需要做的是跟踪对话框是否已显示,并在OnCreate中使用DialogFragment再次显示它。
以前使用Activity.dismissDialogActivity.showDialog来完成,但现在已经过时了。
更多信息:使用对话框片段

3
我最终使用了DialogFragment,它起到了作用。
public class MainActivity extends Activity{



    public void prepareViews(int ID, boolean state){
        switch(ID){
        case USERNAME_TEXTBOX:
            LoginUsernameTextBox.setEnabled(state);
            break;
        case PASSWORD_TEXTBOX:
            LoginPasswordTextBox.setEnabled(state);
            break;
        case LOGIN_BUTTON:
            LoginButton.setEnabled(state);
            break;
        case LOGIN_PROGRESSBAR:
            if(state == true){
                LoginProgressBar.setVisibility(View.VISIBLE);
                LoginProgressBar.setIndeterminate(true); }
            else{
                LoginProgressBar.setVisibility(View.GONE);
            }
            break;
        case CONNECTING_DIALOG:
            if(state == true){
                showDialog();
            }
            break;
        }
    }

public void showDialog() {
        FragmentManager fragmentManager = getFragmentManager();
        ProgressDialogFragment newFragment = new ProgressDialogFragment();
        newFragment.show(fragmentManager, "Dialog");
    }

public static class ProgressDialogFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            final ProgressDialog progressDialog = ProgressDialog.show(getActivity(), "", "Connecting to " 
                    + DeviceName.subSequence(0, DeviceName.length() - 17)); 
            return progressDialog;
        }
    }
}

理想情况下,为了隐藏它,您应该在对话框片段上调用方法,而不是在 progressDialog 上调用方法,以保持对话框片段的实现与活动分离。也就是说,如果您想要更改对话框片段显示信息的方式,而不必同时更改活动。 - frozenkoi

1

试试这个。

if ( progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }

这里是链接 Android文档


0
你需要重载 onConfigurationChanged() 并在清单文件中为活动添加 android:coinfigChange="orientation"
如果你需要处理旋转布局,你需要做类似以下的事情。
@Override
public void onConfigurationChanged(Configuration newConfig){

    if(!isConnection){    
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.main);
    }        
}

如果您想完全处理旋转,可以在调用setContentView()后重新构建进度对话框。


0

您需要自己处理屏幕方向的变化。在您的清单文件中,对于所有需要进行此操作的活动,请添加android:coinfigChange="orientation"。这将防止系统在旋转时销毁和重新创建您的应用程序,并调用您的活动的onConfigChange函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接