“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 singletonDialogBuilder
classe et la même question demeure. Je commence à penser que mon Activité n'est pas correctement initialisé.
Vous devez vous connecter pour publier un commentaire.
Je pense avoir résolu le problème: Si pour certaines raison de créer l'AlertDialog avec:
I. e. avec
.show();
au lieu de.create();
La question n'est plus présent. Je ne sais pas pourquoi cela fonctionne ou ce qui diffère de laAlertDialog.Builder::show()
fonction de laAlertDialog.Builder::create();
fonction (en plus de l'évidente différence reflète dans les noms de fonction).Essayer d'appeler le
.setView(view)
droite après le constructeur.T-il de l'aide?
Il est peut-être pas la solution..mais j'ai été un peu surpris par cette pièce:
J'ai pensé que vous devriez mettre en œuvre onClick à l'intérieur de l'auditeur? suis-je tort?
onClick
fonction). J'ai été un peu désireux de soumettre ma question, si (désolé pour ça).