Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StackOverflowerError尝试在DialogFragment中为AlertDialog膨胀自定义布局时_Java_Android_Android Layout_Android Dialogfragment - Fatal编程技术网

Java StackOverflowerError尝试在DialogFragment中为AlertDialog膨胀自定义布局时

Java StackOverflowerError尝试在DialogFragment中为AlertDialog膨胀自定义布局时,java,android,android-layout,android-dialogfragment,Java,Android,Android Layout,Android Dialogfragment,我试图通过使用构建器并设置自定义视图来创建AlertDialog。当我尝试在onCreateDialog内部膨胀视图时,我得到一个StackOverflower错误 以下是循环返回onCreateDialog的代码: @Override public Dialog onCreateDialog(Bundle savedInstanceState){ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

我试图通过使用构建器并设置自定义视图来创建AlertDialog。当我尝试在onCreateDialog内部膨胀视图时,我得到一个StackOverflower错误

以下是循环返回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
所以。。如果我无法在onCreateDialog内部获得LayoutFlator而不引起无限递归,那么如何为自定义AlertDialog膨胀视图?

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

我在这个答案中找到了解决方案:

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

getLayoutInflater(savedInstanceState)


编辑:它们是相同的。有关详细信息,请参见此答案:

看起来这在片段1.2.3中已修复:


文档确实使用了
requireActivity().getLayoutFlater()
,而不仅仅是
getLayoutFlater
,但是仍然不推荐使用它。

您应该使用
LayoutFlater.from(getContext())

如果您使用的是
viewbindings
,您可以这样称呼它:


binding=FragmentOtpDialogBinding.flate(LayoutInflater.from(getContext())

您在时间输入对话框中有什么?也不要害怕发布stacktrace,但有例外。请添加您的Logcat输出。我添加了Logcat输出@Luksprog,
time\u entry\u dialog
只是一个以重心为中心的线性布局,这是安卓的bug吗?我也遇到了这个问题,对我来说,从GetLayoutFlater中调用CreateDialog没有意义?
LayoutFlater.from(getContext())
似乎也可以工作。
getActivity().GetLayoutFlater()
也可以工作,不过您还应该检查
getActivity()
如果使用v4支持库片段,则返回
null
。令人失望的是,5年后,Android文档仍然指导人们使用错误的方法:
layoutInflater.inflate(…)
layoutInflater.from(getContext())和getActivity().getLayoutInflater()都在工作。
getLayoutInflater(savedInstanceState)
getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);