2012-09-20 63 views
0

这里是我的代码:AlertDialog用的onCreate(自定义视图)

public class MainActivity extends Activity { 

    private static final int CONFIRMATION_DIALOG = 0; 
    private View mLoginConfirmView; 
    private TextView mTextViewLoginConfirm; 
    private CheckBox mCheckBoxLoginConfirm; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mLoginConfirmView = View.inflate(this, R.layout.dialog_login_confirmation, null); 
     mTextViewLoginConfirm = (TextView) mLoginConfirmView.findViewById(R.id.textView_DialogTranspConfirm); 
     mCheckBoxLoginConfirm = (CheckBox) mLoginConfirmView.findViewById(R.id.checkBox_DialogTranspConfirm); 

     showDialog(CONFIRMATION_DIALOG); 
    } 

    @Override 
    @Deprecated 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case CONFIRMATION_DIALOG: { 


      return new AlertDialog.Builder(this) 
      .setIcon(android.R.drawable.stat_sys_warning) 
      .setTitle(R.string.app_name) 
      .setView(mLoginConfirmView) 
      .setPositiveButton(R.string.change, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 

        dialog.dismiss(); 

        showDialog(EXIT_PROGRESS_DIALOG); 
       } 
      }) 
      .setNegativeButton(R.string.go_ahead, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 

        dialog.dismiss(); 

        if (mCheckBoxLoginConfirm.isChecked()) 
         setConfirmationDialogHidden(); 
       } 
      }) 
      .create(); 
     } 
      break; 

     default: 
      break; 
     } 
     return super.onCreateDialog(id); 
    } 

    @Override 
    @Deprecated 
    protected void onPrepareDialog(int id, Dialog dialog) { 
     switch (id) { 
     case CONFIRMATION_DIALOG: 

      CheckBox checkBox = (CheckBox)dialog.findViewById(R.id.checkBox_DialogTranspConfirm); 
      checkBox.setChecked(false); 
      TextView textView = (TextView)dialog.findViewById(R.id.textView_DialogTranspConfirm); 
      textView.setText(getString(R.string.you_use_service_for, Utils.getNumber())); 


      break; 

     default: 
      break; 
     } 
     super.onPrepareDialog(id, dialog); 
    } 
} 

它崩溃只在HTC一个S,当从就行了,在这里我把我的自定义视图背景我的应用程序的回报:

.setView(mLoginConfirmView)

Throwing:java.lang.IllegalStateException:指定的子项已经有父项。您必须先调用子对象的父对象的removeView()。 我决定添加下列检查:如果认为有父,我什么都不做:

@Override 
    @Deprecated 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
     case CONFIRMATION_DIALOG: { 

     ViewGroup parent = (ViewGroup) mLoginConfirmView.getParent(); 
      if (parent!=null) 
       return super.onCreateDialog(id); 

      return new AlertDialog.Builder(this) 
      .setIcon(android.R.drawable.stat_sys_warning) 
      .setTitle(R.string.app_name) 
      .setView(mLoginConfirmView) 
      .setPositiveButton(R.string.change, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 

        dialog.dismiss(); 

        showDialog(EXIT_PROGRESS_DIALOG); 
       } 
      }) 
      .setNegativeButton(R.string.go_ahead, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 

        dialog.dismiss(); 

        if (mCheckBoxLoginConfirm.isChecked()) 
         setConfirmationDialogHidden(); 
       } 
      }) 
      .create(); 
     } 
      break; 

     default: 
      break; 
     } 
     return super.onCreateDialog(id); 
    } 

是不是正确的方式?我可以从onCreate()显示对话框吗?

回答

2

由于活动的UI尚未准备好,并且活动尚未显示给用户,因此android会在其onResume()执行完成后显示屏幕,尝试显示来自onResume()的对话框

相关问题