2013-03-01 6 views
6

Próbuję utworzyć AlertDialog, za pomocą Buildera i ustawienie niestandardowego widoku. Kiedy próbuję nadmuchać widok wewnątrz onCreateDialog, otrzymuję StackOverflowError ..StackOverflowError podczas próby nadania niestandardowego układu dla AlertDialog wewnątrz DialogFragment

Oto kod aż do punktu, gdzie zawraca do onCreateDialog:

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

i tu jest wyjście LogCat:

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: znalazłem tej linii w źródle DialogFragment.getLayoutInflater():

mDialog = onCreateDialog(savedInstanceState); 

Więc ... jeśli nie mogę uzyskać elementu LayoutInflator wewnątrz onCreateDialog bez powodowania nieskończonej rekurencji, w jaki sposób mogę nadmuchać widok dla niestandardowego AlertDialog?

+0

Co masz w 'time_entry_dialog'? Nie bój się też opublikować stosu z wyjątkiem. – Luksprog

+0

Proszę dodać dane wyjściowe Logcat –

+0

Dodałem dane wyjściowe LogCat. @Luksprog, 'time_entry_dialog' to tylko LinearLayout z wyśrodkowaną grawitacją –

Odpowiedz

12

Jeśli wystąpił problem. DialogFragment.getLayoutInflater() zawiera wywołanie onCreateDialog(), więc wywołanie onCreateDialog() z poziomu getLayoutInflater() tworzy nieskończoną pętlę.

znalazłem rozwiązanie w tej odpowiedzi: https://stackoverflow.com/a/10585164/2020340

Nie jestem do końca pewien, czy jest to dobra forma, bo tak naprawdę nie wydają się podoba, ale wymieniłem

getLayoutInflater(savedInstanceState) 

z

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

Nice! Uratowałem mój dzień –

+0

I moje! Dzięki. –

+1

Czy to błąd Androida? Też miałem ten problem i do mnie wołającCreateDialog z wewnątrz getLayoutInflater nie ma sensu? – medonja