如何在AndroidStudio中使用Kotlin创建自定义弹出菜单?

16

我正在尝试创建Android中使用Kotlin编写的类似这个弹出式菜单,当点击一个按钮视图时。我在SOF和Google中搜索了很久也没有找到任何建议。有人可以提供一些示例代码来实现吗?


Kotlin只是一种编程语言。你可以在Java中找到很多例子,我建议你至少要了解这两种语言。一旦你理解了代码的作用,就可以尝试使用不同的语言和语法进行编程。 - Eugen Pechanec
是的,我同意你的观点,但是没有使用 Kotlin 语言的示例。 - Shailendra Madda
3个回答

44

最终,我做到了,它可能会帮助到某些人。

步骤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()
    }

如果我想要为弹出菜单中的一个操作打开一个片段,代码会是什么样子? - Dan
@Dan,你能否将它作为一个新问题发布吗? - Shailendra Madda
1
@Dan 可以在 Activity 中通过以下方式调用此实用程序方法:ActivityUtil.addFragmentToActivity( getSupportFragmentManager(), fragment, R.id.frag_container); - Shailendra Madda

5

遵循Kotlin的“简洁易懂”原则: 你也可以这样做:

1)在你的 .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中设置方法似乎只有在Activity中才有效,而不是在Fragment中。https://dev59.com/hmYq5IYBdhLWcg3w2UMU#18896666 - ThomasW

2

对于讨厌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()
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接