Kotlin:如何使用Anko DSL制作工具栏菜单?

时间:2017-10-14 06:46:19

标签: android menu kotlin toolbar anko

如何在UI类中直接使用Anko DSL制作Android工具栏菜单? 不想在我的Activity类中编写监听器。

关于我在下面给出的答案,有没有办法避免XML recource文件来描述菜单项?

2 个答案:

答案 0 :(得分:3)

Anko还没有任何菜单构建帮助程序。但是有一个open Pull Request

在此之前,您可以使用标准的Kotlin / Android工具在代码中轻松创建菜单项:

class ActivityMainUi: AnkoComponent<ActivityMain> {
    override fun createView(ui: AnkoContext<ActivityMain>) = with(ui) {
        coordinatorLayout {
            appBarLayout {
                lparams(width = matchParent, height = wrapContent)

                toolbar {
                    lparams(width = matchParent, height = wrapContent)

                    menu.apply {
                        add("Action1").apply {
                            tooltipText = "Start Action 1"

                            // Unfortunately you cant't use `icon = R.drawable.ic_action_foo` here,
                            // because it would expect a Drawable instead of a Resource ID
                            setIcon(R.drawable.ic_action_foo)

                            setOnMenuItemClickListener {
                                startActivity<Activity1>()
                                true
                            }
                        }

                        add("Action2")
                                // If you don't like the extra apply,
                                // you can also use chain most of the setters
                                .setTooltipText("Start Action 2")
                                .setIcon(R.drawable.ic_action_bar)
                                .setOnMenuItemClickListener {
                                    startActivity<Activity2>()
                                    true
                                }
                                // Not all types of menu Icons do actually show the icon,
                                // so make it an Action for demo purposes
                                .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) // <-- this is actually one of the setters, that cant be chained
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

AndroidManifest.xml 文件中选择不带ActionBar的主题

照常创建菜单XML资源文件:

<menu ...>
  <item
    android:id="@+id/action1"
    android:title="Action1"/>
  <item
    android:id="@+id/action2"
    android:title="Action2"/>
</menu>

对于菜单中的每个项目,请创建自定义活动

创建主要活动类:

class ActivityMain : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       ActivityMainUI().setContentView(this)

       //do not use setActionBar() or setSupportActionBar()
    }

    // do not override onOptionsItemSelected() and onCreateOptionsMenu() here

 }


class ActivityMainUi: AnkoComponent<ActivityMain> {

    override fun createView(ui: AnkoContext<ActivityMain>) = with(ui) {

        coordinatorLayout {

            // justify layout

            appBarLayout {

                toolbar {

                    // justify your toolbar

                    inflateMenu(R.menu.your_menu_xml_resource)

                    onMenuItemClick { item ->
                        when (item!!.itemId) {
                            R.id.action_1 -> {
                                startActivity<Activity1>()
                                true
                            }
                            R.id.action_2 -> {
                                startActivity<Activity2>()
                                true
                            }
                            else -> false
                        }
                    }

                }.lparams(width = matchParent, height = wrapContent)

            }.lparams(width = matchParent, height = wrapContent)

            // put other views
        }

    }

}