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 } }