2013-03-01 5 views
6

Ich versuche, einen AlertDialog zu erstellen, indem Sie den Builder verwenden und eine benutzerdefinierte Ansicht festlegen. Wenn ich versuche, den Blick ins Innere von onCreateDialog aufzublasen, erhalte ich eine Stackoverflow ..StackOverflowError beim Versuch, ein benutzerdefiniertes Layout für einen AlertDialog in einem DialogFragment zu inflationieren

Hier den Code bis zu dem Punkt, wo es zu onCreateDialog Schleife zurück:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState){ 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle(R.string.enter_time); 

    LinearLayout outerLayout = (LinearLayout) getLayoutInflater(savedInstanceState) 
      .inflate(R.layout.time_entry_dialog, null); 
    ... 
} 

Und hier ist die LogCat Ausgang:

02-28 22:30:04.220: E/AndroidRuntime(4250): FATAL EXCEPTION: main 
02-28 22:30:04.220: E/AndroidRuntime(4250): java.lang.StackOverflowError 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.app.Activity.getSystemService(Activity.java:4009) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.view.LayoutInflater.from(LayoutInflater.java:210) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.view.ContextThemeWrapper.getSystemService(ContextThemeWrapper.java:75) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at com.android.internal.app.AlertController$AlertParams.<init>(AlertController.java:812) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:374) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.app.AlertDialog$Builder.<init>(AlertDialog.java:359) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:18) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:21) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at com.sweatyreptile.chee.runtimetracker.TimeEntryDialogFragment.onCreateDialog(TimeEntryDialogFragment.java:21) 
02-28 22:30:04.220: E/AndroidRuntime(4250):  at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295) 
...etc 

EDIT: fand ich diese Zeile in der Quelle DialogFragment.getLayoutInflater():

mDialog = onCreateDialog(savedInstanceState); 

Also .. wenn ich einen LayoutInflator innerhalb von onCreateDialog nicht ohne unendliche Rekursion bekommen kann, wie kann ich eine Ansicht für einen benutzerdefinierten AlertDialog aufblasen?

+0

Was haben Sie im 'time_entry_dialog'? Haben Sie auch keine Angst, den Stacktrace mit Ausnahme zu posten. – Luksprog

+0

Bitte fügen Sie Ihre Logcat-Ausgabe hinzu –

+0

Ich habe die LogCat-Ausgabe hinzugefügt. @Luksprog, 'time_entry_dialog' ist nur ein LinearLayout mit zentrierter Schwerkraft –

Antwort

12

Wenn das Problem gefunden wurde. DialogFragment.getLayoutInflater() enthält einen Anruf an onCreateDialog(), so ruft onCreateDialog() aus getLayoutInflater() eine Endlosschleife.

fand ich die Lösung in dieser Antwort: https://stackoverflow.com/a/10585164/2020340

ich nicht ganz sicher bin, ob dies eine gute Form ist, weil sie nicht wirklich, wie es scheint, aber ich ersetzt

getLayoutInflater(savedInstanceState) 

mit

getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
+1

Schön! Mein Tag gerettet –

+0

Und meins! Vielen Dank. –

+1

Ist das ein Android-Fehler? Ich hatte dieses Problem auch, und für mich Aufruf von CreateDialog von getLayoutInFlater macht keinen Sinn? – medonja

Verwandte Themen