如何在片段内使用Anko DSL?

Github的wiki页面显示了在Activity实例中使用的这个例子:

 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) verticalLayout { padding = dip(30) editText { hint = "Name" textSize = 24f } editText { hint = "Password" textSize = 24f } button("Login") { textSize = 26f } } } 

如何在Fragment内做同样的事情?

我试图把这verticalLayout块在onCreateView但方法不能解决。 我添加了anko-support-v4依赖项,但仍然没有运气。

Solutions Collecting From Web of "如何在片段内使用Anko DSL?"

使用Anko 0.8,你也可以使用一个AnkoComponent ,如果你想把你的UI保存在一个单独的类中,那么你可以在别处重用它。

 class FragmentUi<T>: AnkoComponent<T> { override fun createView(ui: AnkoContext<T>) = with(ui) { verticalLayout { // ... } } } 

你可以在你的片段onCreateView()调用它

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View = FragmentUi<Fragment>().createView(AnkoContext.create(ctx, this)) 

在挖掘了anko-support-v4源代码以及一些试用和错误之后,我发现了一个解决方法,尽pipe我不确定它是否是正确的/推荐的方法。 这似乎有点无证。

来自我的Fragment代码的示例:

 override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return UI { verticalLayout { linearLayout { avatar = imageView().lparams(width = dip(48), height = dip (48)) name = textView().lparams(width = 0, weight = 1f) } linearLayout { // ... } } }.toView() } 

我正在返回包装在UI { ... }.toView() Fragment.onCreateView(...)

从anko 0.8.1开始,正确的代码是:

 override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return UI { verticalLayout { linearLayout { // ... } linearLayout { // ... } } }.view }