如何在 Android Studio 中使用 Kotlin 创建自定义弹出菜单?
How to create custom Popup Menu using Kotlin in AndroidStudio?
我正在尝试使用 Koltin 创建弹出菜单,类似于 this 单击 Android 中的按钮视图。我搜索了 SOF,Google 没有找到任何建议。任何人都可以提供一个示例代码来使用 kotlin 实现它。
终于,我做到了,可能对某人有帮助
第 1 步。首先,创建一个 activity_main.xml
包含一个名为 my_button
的按钮
第2步。然后在res/menu
下取header_menu.xml
:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/header1"
android:title="H1" />
<item
android:id="@+id/header2"
android:title="H2" />
<item
android:id="@+id/header3"
android:title="H3" />
</menu>
第 3 步。最后,在 MainActivity.kt
中使用它:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
my_button.setOnClickListener {
showPopup(my_button)
}
}
private fun showPopup(view: View) {
val popup = PopupMenu(this, view)
popup.inflate(R.menu.header_menu)
popup.setOnMenuItemClickListener(PopupMenu.OnMenuItemClickListener { item: MenuItem? ->
when (item!!.itemId) {
R.id.header1 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show()
}
R.id.header2 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show()
}
R.id.header3 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show()
}
}
true
})
popup.show()
}
遵循 Kotlin 的干净整洁的原则:
您也可以这样做:
1) 在你的 .xml 文件中:(但是 xml 中的 "onClick" 也可以在执行 java 时使用)
<Button
........
android:onClick="showPopUp"
....../>
2) 在您的 .kt 文件中:(使用 kotlin 的 lambda 表达式)
fun showPopUp(view: View) {
val popupMenu = PopupMenu(this, view)
val inflater = popupMenu.menuInflater
inflater.inflate(R.menu.header_menu, popupMenu.menu)
popupMenu.show()
popupMenu.setOnMenuItemClickListener {
when(it.itemId) {
R.id.header1 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show();
}
R.id.header2 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show();
}
R.id.header3 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show();
}
...........
}
true
}
}
对于讨厌 xml 的人:
private fun showOverflowMenu(context: Context, anchor: View) {
val menu = PopupMenu(context, anchor)
menu.menu.apply {
add("Rename").setOnMenuItemClickListener {
// TODO rename
true
}
add("change context").setOnMenuItemClickListener {
// change stuff
true
}
add("delete").setOnMenuItemClickListener {
// TODO delete some stuff
true
}
}
menu.show()
}
我正在尝试使用 Koltin 创建弹出菜单,类似于 this 单击 Android 中的按钮视图。我搜索了 SOF,Google 没有找到任何建议。任何人都可以提供一个示例代码来使用 kotlin 实现它。
终于,我做到了,可能对某人有帮助
第 1 步。首先,创建一个 activity_main.xml
包含一个名为 my_button
第2步。然后在res/menu
下取header_menu.xml
:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/header1"
android:title="H1" />
<item
android:id="@+id/header2"
android:title="H2" />
<item
android:id="@+id/header3"
android:title="H3" />
</menu>
第 3 步。最后,在 MainActivity.kt
中使用它:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
my_button.setOnClickListener {
showPopup(my_button)
}
}
private fun showPopup(view: View) {
val popup = PopupMenu(this, view)
popup.inflate(R.menu.header_menu)
popup.setOnMenuItemClickListener(PopupMenu.OnMenuItemClickListener { item: MenuItem? ->
when (item!!.itemId) {
R.id.header1 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show()
}
R.id.header2 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show()
}
R.id.header3 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show()
}
}
true
})
popup.show()
}
遵循 Kotlin 的干净整洁的原则: 您也可以这样做:
1) 在你的 .xml 文件中:(但是 xml 中的 "onClick" 也可以在执行 java 时使用)
<Button
........
android:onClick="showPopUp"
....../>
2) 在您的 .kt 文件中:(使用 kotlin 的 lambda 表达式)
fun showPopUp(view: View) {
val popupMenu = PopupMenu(this, view)
val inflater = popupMenu.menuInflater
inflater.inflate(R.menu.header_menu, popupMenu.menu)
popupMenu.show()
popupMenu.setOnMenuItemClickListener {
when(it.itemId) {
R.id.header1 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show();
}
R.id.header2 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show();
}
R.id.header3 -> {
Toast.makeText(this@MainActivity, item.title, Toast.LENGTH_SHORT).show();
}
...........
}
true
}
}
对于讨厌 xml 的人:
private fun showOverflowMenu(context: Context, anchor: View) {
val menu = PopupMenu(context, anchor)
menu.menu.apply {
add("Rename").setOnMenuItemClickListener {
// TODO rename
true
}
add("change context").setOnMenuItemClickListener {
// change stuff
true
}
add("delete").setOnMenuItemClickListener {
// TODO delete some stuff
true
}
}
menu.show()
}