如何使用Anko DSL制作通用AppBar?

我正在尝试制作一个可以插入其他Anko组件的工具栏。 这是我要做的一个例子:

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MainUI().setContentView(this) val toolbar: Toolbar = find(R.id.toolbar) setSupportActionBar(toolbar) } } class MainUI : AnkoComponent<MainActivity> { override fun createView(ui: AnkoContext<MainActivity>) = with(ui) { coordinatorLayout { fitsSystemWindows = true lparams { width = matchParent height = matchParent } ToolbarUI().createView(ui).lparams { width = matchParent } recyclerView {...}.lparams { width = matchParent height = matchParent behavior = AppBarLayout.ScrollingViewBehavior() } } } } class ToolbarUI : AnkoComponent<AppCompatActivity> { override fun createView(ui: AnkoContext<AppCompatActivity>) = with(ui) { appBarLayout { ... toolbar { setTitleTextColor(Color.WHITE) id = R.id.toolbar title = resources.getString(R.string.main_activity) ... }.lparams { width = matchParent height = wrapContent } } } } 

这样,我可以使用这个相同的AppBarLayout与更少的代码。 但我得到这个: java.lang.IllegalStateException: View is already set: org.jetbrains.anko.design._AppBarLayout

任何人都可以帮助我正确的方式来实现这一点?

基于这个答案 ,我可以用ViewManager来做到这一点 。

这是新的代码:

 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MainUI().setContentView(this) val toolbar: Toolbar = find(R.id.toolbar) setSupportActionBar(toolbar) } } class MainUI : AnkoComponent<MainActivity> { override fun createView(ui: AnkoContext<MainActivity>) = with(ui) { coordinatorLayout { fitsSystemWindows = true lparams { width = matchParent height = matchParent } toolbarUI(resources.getString(R.string.main_activity)).lparams { width = matchParent } recyclerView {...}.lparams { width = matchParent height = matchParent behavior = AppBarLayout.ScrollingViewBehavior() } } } fun ViewManager.toolbarUI(activity: String) = appBarLayout { toolbar { setTitleTextColor(Color.WHITE) id = R.id.toolbar title = activity }.lparams { width = matchParent height = wrapContent } } } 

问题是ToolbarUI().createView(ui)ui上的同一个AnkoContext上创建视图,默认情况下是使用setContentView = true创建的。 您可以尝试使用另一个AnkoContext,它不会将视图附加到Activity: ToolbarUI().createView(AnkoContextImpl(activity, this /* parent ViewGroup */, true))