6

我有一个在连接到蓝牙设备时显示 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;
        }
    }
4

5 回答 5

8

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

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

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

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

于 2013-01-24T20:27:43.583 回答
3

I end up to use DialogFragment and it works.

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;
        }
    }
}
于 2013-01-26T16:30:56.257 回答
1

尝试这个。

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

这是链接android Docs

于 2013-01-24T20:23:15.803 回答
0

你必须自己处理方向改变才能做到这一点。在您的清单中,为您想要执行此操作的所有活动添加 android:coinfigChange="orientation"。这将防止系统在轮换时销毁和重新创建您的应用程序,而是调用您的活动的 onConfigChange 函数。

于 2013-01-24T20:21:05.907 回答
0

您需要重载onConfigurationChanged()并将其添加android:coinfigChange="orientation"到清单中的活动。

如果您需要明智地处理旋转布局,则需要执行以下操作

@Override
public void onConfigurationChanged(Configuration newConfig){

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

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

于 2013-01-24T20:25:57.840 回答