如何在片段中使用Anko DSL?

时间:2015-11-16 07:13:33

标签: android android-layout android-fragments kotlin anko

Github wiki page显示此示例将在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中,但该方法无法解析。我添加了ITest依赖,但仍然没有运气。

3 个答案:

答案 0 :(得分:20)

使用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))

答案 1 :(得分:12)

在挖掘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()
} 
  

我正在UI { ... }.toView()

中返回Fragment.onCreateView(...)中包含的布局DSL

答案 2 :(得分:5)

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

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