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)
请记住,Android会在您旋转设备时销毁并重新创建活动.您的问题很可能progressDialog是null因为在重新创建Activity后,该变量未再次设置.
您需要使用DialogFragment并记住活动生命周期.您需要做的是跟踪是否显示对话框并使用DialogFragment在OnCreate中再次显示该对话框.
以前它是使用Activity.dismissDialog和Activity.showDialog完成的,但现在已弃用.
更多信息:使用对话框片段.
我最终使用 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)