0

我正在尝试制作一个可以插入到其他 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

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

4

2 回答 2

2

我可以根据这个答案使用 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
        }
    }
}
于 2017-05-31T07:30:42.217 回答
1

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

于 2017-05-31T07:33:13.767 回答