“android.util.AndroidRuntimeException: requestFeature() muss aufgerufen werden, bevor das hinzufügen von Inhalt" auf showDialog(dialogId)

Dieser ist treibt mich an den Rand des Wahnsinns!

Ich habe eine Tätigkeit, wo ich initialisiert eine Button-Ansicht mit einem onClickListener, etwa so:

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

Habe ich auch geschrieben, meine eigene dialog-generator-Klasse (singleton), da ich mehrere andere Aktivität ist in meiner Anwendung, die einen gemeinsamen Satz von Dialogen, also in der onCreateDialog(int id) Funktion für die gegebene Aktivität, die ich nenne:

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

Den mUri und mListener Variablen definiert an anderer Stelle, und ich habe überprüft, ob Sie gültig sind. Die relevanten Teile des singleton - DialogBuilder - Klasse sieht wie folgt aus:

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

Nun, wenn ich meine Anwendung und Tippen Sie auf die Schaltfläche (d.h. mMyButton) bekomme ich folgende exception stack trace:

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

Wenn ich interpretieren die stack-trace-korrekt, das Problem ist der Auslöser der moment, in dem ich auf meine Schaltfläche (wie von com.dbm.myApp.myActivity$4.onClick(myActivity.java:266) was ist der genaue showDialog(ID_MYDIALOG); Linie).

Was tun Sie, Kolleginnen und Android-Entwickler sagen? Das, was du Sie denken verursacht mein problem?

Es ist fair, anzunehmen, dass der obige code Valide ist, nach der Kompilierung und unit-tests usw.. Den angegebenen code aus, ist jedoch vereinfacht und entfernt werden, um zu passen das forum, daher, bitte setzen Sie nicht eine Anstrengung, um zu kommentieren die Namenskonventionen, etc.

  • Ich habe über diesen, aber ich kann mich nicht erinnern, die genauen fix 🙁 brauchen Sie, um zu rufen: requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); In Ihrem DialogBuilder Klasse?
  • Ein guter Tipp, habe es gerade getestet, aber leider das Problem weiterhin. Auch ich hätte zu Lesen, ein bisschen auf der requestFeature () - Funktion (oder der short-cut-version: requestWindowFeature()) und das, was Sie wirklich tun, um meine Anwendung.
  • Ich habe es nun getestet, kommentieren Sie alles, was in der getMyDialog Funktion in der singleton - DialogBuilder Klasse und das gleiche Problem bleibt. Ich fange an zu denken, dass meine Tätigkeit nicht ordnungsgemäß initialisiert.
InformationsquelleAutor dbm | 2011-01-28
Schreibe einen Kommentar