如何防止ProgressDialog在Android中解除屏幕旋转变化?

use*_*162 6 java android dialog

我有一个活动,在连接到蓝牙设备时显示ProgressDialog.在ProgressDialog启动时,它会正常工作,直到屏幕方向发生变化.ProgressDialog消失,建立连接后,app调用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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

fro*_*koi 8

请记住,Android会在您旋转设备时销毁并重新创建活动.您的问题很可能progressDialognull因为在重新创建Activity后,该变量未再次设置.

您需要使用DialogFragment并记住活动生命周期.您需要做的是跟踪是否显示对话框并使用DialogFragment在OnCreate中再次显示该对话框.

以前它是使用Activity.dismissDialogActivity.showDialog完成的,但现在已弃用.

更多信息:使用对话框片段.


use*_*162 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)