DialogFragment中的Kotlin合成和自定义布局

比方说,我有这样的布局:

       

我在DialogFragment中使用它:

 class DepartmentChoiceDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val builder = AlertDialog.Builder(activity) builder.setTitle(R.string.choose_or_create_dep) .setView(R.layout.department_chooser_dialog) .setNegativeButton(android.R.string.cancel, { d, i -> d.cancel() }) return builder.create() } } 

如果我参考使用合成的小部件:

 override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dep_list.layoutManager = LinearLayoutManager(activity) dep_list.itemAnimator = DefaultItemAnimator() dep_list.setHasFixedSize(true) } 

我在运行时遇到这个错误:

java.lang.NullPointerException:尝试在MyDialog的空对象引用上调用虚拟方法’android.view.View android.view.View.findViewById(int)’._ $ _ findCachedViewById(DepartmentChoiceDialog.kt:0)

我不明白如何在DialogFragment的情况下使用合成。 它在Fragment和Activity中工作正常。

将您的代码从onActivityCreated移动到onViewCreated方法。 喜欢这个:

 import kotlinx.android.synthetic.main.department_chooser_dialog.dep_list override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) dep_list.apply { layoutManager = LinearLayoutManager(activity) itemAnimator = DefaultItemAnimator() setHasFixedSize(true) } } 

我其实并没有深入到生成的代码,也许有一个错误。

以前的答案将无法正常工作,因为在使用onCreateDialog时不会调用onViewCreated。 你应该先导入kotlinx … department_chooser_dialog。 查看 .dep_list,然后使用它如下:

 import kotlinx.android.synthetic.main.department_chooser_dialog.view.dep_list ... class DepartmentChoiceDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val builder = AlertDialog.Builder(activity) val dialog = inflater.inflate(R.layout.department_chooser_dialog, null) dialog.dep_list.layoutManager = LinearLayoutManager(activity) dialog.dep_list.itemAnimator = DefaultItemAnimator() dialog.dep_list.setHasFixedSize(true) builder.setTitle(R.string.choose_or_create_dep) .setView(dialog) ... 

视图可以通过onCreateDialog膨胀视图来访问。 因此,如果将视图保存在variables( rootView )中,则可以使用YourDialogFragment任何方法访问视图。

 // ... import kotlinx.android.synthetic.main.your_layout.view.* class YourDialogFragment : DialogFragment() { private lateinit var rootView: View override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { rootView = activity.layoutInflater.inflate(R.layout.your_layout, null as ViewGroup?) rootView.someTextView.text = "Hello" // works } }