“android.util.AndroidRuntimeException: requestFeature() doit être appelée avant d'ajouter du contenu” sur showDialog(dialogId)

Ce on me conduit au bord de la folie!

J'ai une activité où j'initialise un Bouton afficher avec un onClickListener, comme suit:

@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);
        }
    });
}

J'ai également écrit de ma propre boîte de dialogue générateur de classe (un singleton) depuis que j'ai plusieurs autre Activité dans mon application en utilisant un ensemble commun de dialogues, de là, dans la onCreateDialog(int id) fonction de l'Activité que j'appel:

@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;
}

La mUri et mListener variables sont définies ailleurs et j'ai vérifié qu'ils sont valides. Les parties pertinentes de l'singleton DialogBuilder classe ressemble à ceci:

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();
}

Maintenant, quand je lance mon application et appuyez sur le bouton (c'est à dire mMyButton) j'ai le trace de pile d'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

Si j'interprète la trace de la pile correctement la question est déclenchée à l'instant où j'appuie sur mon bouton (comme de com.dbm.myApp.myActivity$4.onClick(myActivity.java:266) qui est l'exact showDialog(ID_MYDIALOG); ligne).

Que voulez-vous, collègues développeurs Android dire? Ce que vous pensez du est à l'origine de mon problème?

Il est juste de supposer que le code ci-dessus est valide, conformément à la compilation et les tests unitaires, etc. Le code donné est, cependant, simplifiée et réduite à l'ajustement du forum, donc merci de ne pas mettre un effort pour commenter les conventions de nommage etc.

  • Je suis venu à travers cela, mais je ne me souviens pas exactement corrigé 🙁 avez-vous besoin d'appeler: requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); Dans votre DialogBuilder classe?
  • Un bon conseil, je l'ai juste testé, mais malheureusement, le problème demeure. Aussi je pourrais avoir à lire un peu sur le requestFeature() fonction (ou de la courte-coupe version: requestWindowFeature()) et ce qu'ils font réellement pour mon application.
  • J'ai testé pour commenter tout dans le getMyDialog fonction dans le singleton DialogBuilder classe et la même question demeure. Je commence à penser que mon Activité n'est pas correctement initialisé.
InformationsquelleAutor dbm | 2011-01-28