21

我正在尝试通过使用 Builder 并设置自定义视图来创建 AlertDialog。当我尝试在 onCreateDialog 中膨胀视图时,我得到一个 StackOverflowError ..

以下是循环回 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 膨胀视图?

4

3 回答 3

34

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

我在这个答案中找到了解决方案:https ://stackoverflow.com/a/10585164/2020340

我不确定这是否是好的形式,因为它看起来并不像它,但我替换了

getLayoutInflater(savedInstanceState)

getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

编辑:它们是相同的。有关详细信息,请参阅此答案:https ://stackoverflow.com/a/20995083/2020340

于 2013-03-01T07:35:14.157 回答
1

你应该使用LayoutInflater.from(getContext()).

如果你正在使用viewbindings,你可以这样称呼它:

binding = FragmentOtpDialogBinding.inflate(LayoutInflater.from(getContext()));

于 2020-08-15T08:09:03.487 回答
1

看起来这是在 Fragment 1.2.3 中修复的:https ://developer.android.com/jetpack/androidx/releases/fragment#1.2.3 。

文档确实使用requireActivity().getLayoutInflater(),而不是仅仅使用getLayoutInflater,因此可能仍然不推荐使用。

于 2020-05-15T09:58:27.810 回答