如何在片段内使用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依赖项,但仍然没有运气。

  • Kotlin和惯用的写法,'if not not null,else ......'基于可变值
  • Android Room:查询中的每个绑定variables都必须具有匹配的方法
  • 我怎样才能代表Android Room的多对多关系?
  • 用新的kotlin 1.1构build错误,kapt不能parsing数据绑定参数
  • 禁止“Android中不允许使用标识符”
  • Kotlin延迟属性和值重置:可重置的惰性委托
  • 这种types有一个构造函数,必须在这里初始化 - Kotlin
  • 为Kotlin创建POJO类
  • 使用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 }