“在添加内容之前必须调用android.util.AndroidRuntimeException:requestFeature()on showDialog(dialogId)

这个把我逼到了疯狂的边缘!

我有一个活动,我用一个onClickListener初始化button视图,如下所示:

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.myLayout); mMyButton = (Button) findViewById(R.id.myButtonId); mMyButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showDialog(ID_MYDIALOG); } }); } 

我也写了我自己的对话框生成器类(单身人士),因为我有我的应用程序中将使用一个共同的对话框,因此在给定的活动我调用onCreateDialog(int id)函数的其他几个活动:

 @Override protected Dialog onCreateDialog(int id) { Dialog dialog; switch (id) { case ID_MYDIALOG: dialog = DialogBuilder.getInstance().getMyDialog(this, mUri, mListener); break; default: dialog = null; break; } return dialog; } 

mUrimListenervariables在其他地方定义,我已经validation它们是有效的。 单例DialogBuilder类的相关部分如下所示:

 public AlertDialog getMyDialog(Context context, Uri uri, DialogInterface.OnClickListener listener) { // Inflate the custom body for the AlertDialog. LayoutInflater layoutInflater = LayoutInflater.from(context); View view = layoutInflater.inflate(R.layout.myDialogBody, null); // Get the data to show in the dialog. Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); cursor.moveToFirst(); // Create a suitable data adapter and use it to populate the dialog body with data. MyDialogDataAdapter adapter = new MyDialogDataAdapter(context, cursor); // Populate the GridView in the dialog body with data. GridView grid = (GridView) view.findViewById(R.id.myDialogDataGrid); grid.setAdapter(adapter); return new AlertDialog.Builder(context) .setIcon(R.drawable.myDialogIcon) .setTitle(R.string.myDialogTitle) .setView(view) .setPositiveButton(R.string.myDialogDone, listener) .create(); } 

现在,当我运行我的应用程序,并点击button(即mMyButton ),我得到以下exception堆栈跟踪:

 E/AndroidRuntime( 1247): FATAL EXCEPTION: main E/AndroidRuntime( 1247): android.util.AndroidRuntimeException: requestFeature() must be called before adding content E/AndroidRuntime( 1247): at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:181) E/AndroidRuntime( 1247): at com.android.internal.app.AlertController.installContent(AlertController.java:203) E/AndroidRuntime( 1247): at android.app.AlertDialog.onCreate(AlertDialog.java:251) E/AndroidRuntime( 1247): at android.app.Dialog.dispatchOnCreate(Dialog.java:307) E/AndroidRuntime( 1247): at android.app.Activity.createDialog(Activity.java:886) E/AndroidRuntime( 1247): at android.app.Activity.showDialog(Activity.java:2557) E/AndroidRuntime( 1247): at android.app.Activity.showDialog(Activity.java:2524) E/AndroidRuntime( 1247): at com.dbm.myApp.myActivity$4.onClick(myActivity.java:266) E/AndroidRuntime( 1247): at android.view.View.performClick(View.java:2534) E/AndroidRuntime( 1247): at android.view.View$PerformClick.run(View.java:9210) E/AndroidRuntime( 1247): at android.os.Handler.handleCallback(Handler.java:587) E/AndroidRuntime( 1247): at android.os.Handler.dispatchMessage(Handler.java:92) E/AndroidRuntime( 1247): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime( 1247): at android.app.ActivityThread.main(ActivityThread.java:3652) E/AndroidRuntime( 1247): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 1247): at java.lang.reflect.Method.invoke(Method.java:507) E/AndroidRuntime( 1247): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) E/AndroidRuntime( 1247): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) E/AndroidRuntime( 1247): at dalvik.system.NativeStart.main(Native Method) W/ActivityManager( 212): Force finishing activity com.dbm.myApp/.myActivity 

如果我正确地解释堆栈跟踪,就会触发问题,当我点击我的button(如com.dbm.myApp.myActivity$4.onClick(myActivity.java:266) ,这是确切的showDialog(ID_MYDIALOG);行)。

你是什​​么人,Android开发人员说的? 你认为是什么造成了我的问题?

这是公平的,假设上面的代码是有效的,按照编译和unit testing等。然而,给出的代码被简化和剥离,以适应论坛,因此,请不要努力评论命名约定等。

Solutions Collecting From Web of "“在添加内容之前必须调用android.util.AndroidRuntimeException:requestFeature()on showDialog(dialogId)"

我想我可能已经解决了这个问题:如果我由于某种原因创buildAlertDialog:

 return new AlertDialog.Builder(context) .setIcon(R.drawable.myDialogIcon) .setTitle(R.string.myDialogTitle) .setView(view) .setPositiveButton(R.string.myDialogDone, listener) .show(); 

即与.show(); 而不是.create(); 这个问题不再存在。 我不知道为什么这个工作,或AlertDialog.Builder::create(); AlertDialog.Builder::show()函数有什么不同AlertDialog.Builder::create(); 函数(比各个函数名中反映的明显差异更多)。

尝试在构造函数之后立即调用.setView(view)

 return new AlertDialog.Builder(context) .setView(view) .setIcon(R.drawable.myDialogIcon) .setTitle(R.string.myDialogTitle) .setPositiveButton(R.string.myDialogDone, listener) .create(); 

它有帮助吗?

这可能不是解决办法,但是我对这件事感到有点惊讶:

 mMyButton.setOnClickListener(new View.OnClickListener() { showDialog(ID_MYDIALOG); 

我以为你应该在侦听器中实现onClick ? 我错了吗?