如何在UI类中直接使用Anko DSL制作Android工具栏菜单? 不想在我的Activity类中编写监听器。
关于我在下面给出的答案,有没有办法避免XML recource文件来描述菜单项?
答案 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
}
}
}