这个把我逼到了疯狂的边缘!
我有一个活动,我用一个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; }
mUri
和mListener
variables在其他地方定义,我已经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等。然而,给出的代码被简化和剥离,以适应论坛,因此,请不要努力评论命名约定等。
我想我可能已经解决了这个问题:如果我由于某种原因创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 ? 我错了吗?