Java StackOverflowerError尝试在DialogFragment中为AlertDialog膨胀自定义布局时
我试图通过使用构建器并设置自定义视图来创建AlertDialog。当我尝试在onCreateDialog内部膨胀视图时,我得到一个StackOverflower错误 以下是循环返回onCreateDialog的代码: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());
@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);