如何在片段中使用 Anko DSL?
How to use Anko DSL inside a Fragment?
Github wiki page 显示此示例将在 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
依赖项,但仍然没有成功。
在挖掘 anko-support-v4
源代码以及一些试验和错误之后,我找到了一个解决方法,尽管我不确定它是否是 right/recommended 方法。好像有点无证。
来自我的 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()
}
I'm returning layout DSL wrapped in UI { ... }.toView()
in Fragment.onCreateView(...)
对于 Anko 0.8,您还可以使用 AnkoComponent
,如果您想将 UI 保存在单独的 class 中,以便您可以在其他地方重复使用它。
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 0.8.1 开始,正确的代码是:
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return UI {
verticalLayout {
linearLayout {
// ...
}
linearLayout {
// ...
}
}
}.view
}
Github wiki page 显示此示例将在 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
依赖项,但仍然没有成功。
在挖掘 anko-support-v4
源代码以及一些试验和错误之后,我找到了一个解决方法,尽管我不确定它是否是 right/recommended 方法。好像有点无证。
来自我的 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()
}
I'm returning layout DSL wrapped in
UI { ... }.toView()
inFragment.onCreateView(...)
对于 Anko 0.8,您还可以使用 AnkoComponent
,如果您想将 UI 保存在单独的 class 中,以便您可以在其他地方重复使用它。
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 0.8.1 开始,正确的代码是:
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return UI {
verticalLayout {
linearLayout {
// ...
}
linearLayout {
// ...
}
}
}.view
}