如何在片段中使用Anko DSL?

akh*_*khy 13 android android-layout android-fragments kotlin anko

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

怎么做同样的内心Fragment

我试图将该verticalLayout块放入onCreateView但该方法无法解决.我增加了anko-support-v4依赖性,但仍然没有运气.

Bru*_*let 20

使用Anko 0.8 AnkoComponent,如果要将UI保存在单独的类中,也可以使用an ,以便在其他地方重用它.

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

你可以把它在你的片段onCreateView()通过

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


akh*_*khy 13

在挖掘了anko-support-v4源代码加上一些试验和错误之后,我找到了一个解决方法,虽然我不确定它是否是正确/推荐的方式.它似乎有点无证.

我的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()
} 
Run Code Online (Sandbox Code Playgroud)

我回国布局DSL裹UI { ... }.toView()Fragment.onCreateView(...)

  • @netimen只返回```UI {}.view``` (5认同)
  • 是的,这是当前版本的Anko(0.7.3)的正确方法. (3认同)

Eef*_*ret 6

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

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