2013-03-01 93 views
6

我试图创建一个AlertDialog,通过使用生成器和设置自定义视图。当我试图夸大onCreateDialog内的看法,我得到的StackOverflowError ..StackOverflowError当试图膨胀一个DialogFragment内的AlertDialog的自定义布局

下面是代码达到它返回到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); 
    ... 
} 

这里是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 

编辑:我发现这个线路中的DialogFragment.getLayoutInflater()源:

mDialog = onCreateDialog(savedInstanceState); 

因此..如果我无法在onCreateDialog中获得LayoutInflator而没有导致无限递归,那么如何为定制AlertDialog充气视图?

+0

你在'time_entry_dialog'里有什么?也不要害怕发布stacktrace与例外。 – Luksprog 2013-03-01 06:27:57

+0

请添加您的Logcat输出 – 2013-03-01 06:28:09

+0

我添加了LogCat输出。 @Luksprog,'time_entry_dialog'只是一个以重心为中心的LinearLayout – 2013-03-01 06:35:02

回答

12

如果发现问题。 DialogFragment.getLayoutInflater()包含对onCreateDialog()的调用,因此在getLayoutInflater()内调用onCreateDialog()会创建一个无限循环。

我发现这个答案的解决方案:https://stackoverflow.com/a/10585164/2020340

我不能完全肯定,如果这是个好形式,因为它并没有真正看起来像,但我取代

getLayoutInflater(savedInstanceState) 

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

好!保存我的日子 – 2013-11-06 18:35:40

+0

和我的!谢谢。 – 2015-09-03 10:00:15

+1

这是一个Android的错误?我也有这个问题,并从我的getLayoutInflater调用onCreateDialog没有意义? – medonja 2015-12-29 10:37:24