📜  在Android中长按视图时显示弹出菜单

📅  最后修改于: 2022-05-13 01:56:17.036000             🧑  作者: Mango

在Android中长按视图时显示弹出菜单

Android 弹出菜单在垂直列表中显示项目列表,该列表显示调用菜单的视图,并且对于提供与特定内容相关的操作溢出很有用。在本教程中,我们将学习如何在长按视图时显示弹出菜单。我们将通过在 android studio 中制作一个项目来学习它。在这里,我们将使用Kotlin作为开发语言。借助菜单,用户可以在整个应用程序中体验流畅一致的体验。因此,为了增强应用程序的 UI,我们在长按视图时使用弹出菜单。它可以是 ImageView、EditText、TextView 等任何视图。对于这个项目,我们将使用 ImageView。当我们长按图像时,弹出菜单会显示一个弹出菜单。

分步实施

第 1 步:创建一个新项目。

要在 Android Studio 中创建新项目,请参阅在 kotlin 的 android studio 中创建新项目。

第 2 步:在可绘制对象中添加矢量资源以将其用作图像视图

要添加矢量资产,请访问:

第 3 步:使用 activity_main.xml 文件。

导航到app > res > layout > activity_main.xml并将以下代码添加到该文件。下面是 activity_main.xml 文件的代码。

XML


 
    
 


XML







Kotlin
package com.ayush.popupmenu
 
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import android.widget.PopupMenu
import android.widget.Toast
import java.lang.Exception
 
class MainActivity : AppCompatActivity() {
    lateinit var img: ImageView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        img = findViewById(R.id.img)
        popupMenu()
    }
 
    private fun popupMenu() {
        // creating a object of Popupmenu
        val popupMenu = PopupMenu(this, img)
 
        // we need to inflate the object
        // with popup_menu.xml file
        popupMenu.inflate(R.menu.popup_menu)
 
        // adding click listener to image
        popupMenu.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.share -> {
                    Toast.makeText(this, "Shared", Toast.LENGTH_SHORT).show()
                    true
                }
                R.id.save -> {
                    Toast.makeText(this, "saved", Toast.LENGTH_SHORT).show()
                    true
                }
                R.id.download -> {
                    Toast.makeText(this, "downloaded", Toast.LENGTH_SHORT).show()
                    true
                }
                else -> {
                    true
                }
            }
 
        }
         
        // event on long press on image
        img.setOnLongClickListener {
            try {
                val popup = PopupMenu::class.java.getDeclaredField("mPopup")
                popup.isAccessible = true
                val menu = popup.get(popupMenu)
                menu.javaClass.getDeclaredMethod("setForceShowIcon", Boolean::class.java)
                    .invoke(menu,true)
            }
            catch (e: Exception)
            {
                Log.d("error", e.toString())
            }
            finally {
                popupMenu.show()
            }
            true
        }
    }
}


第 4 步:使用 popup_menu.xml 文件

创建一个菜单目录,然后在弹出菜单的菜单中添加一个新的资源文件。要在 Android Studio 中创建菜单,请参阅本文。这里我们需要添加我们需要在菜单中显示的项目。我们需要指定id和title。我们还可以在标题中添加图像。这是popup_menu.xml的代码:

XML







第 5 步:使用 MainActivity.kt 文件

转到MainActivity.kt文件并参考以下代码。下面是MainActivity.kt文件的代码。在代码中添加注释以理解代码。

科特林

package com.ayush.popupmenu
 
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import android.widget.PopupMenu
import android.widget.Toast
import java.lang.Exception
 
class MainActivity : AppCompatActivity() {
    lateinit var img: ImageView
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        img = findViewById(R.id.img)
        popupMenu()
    }
 
    private fun popupMenu() {
        // creating a object of Popupmenu
        val popupMenu = PopupMenu(this, img)
 
        // we need to inflate the object
        // with popup_menu.xml file
        popupMenu.inflate(R.menu.popup_menu)
 
        // adding click listener to image
        popupMenu.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.share -> {
                    Toast.makeText(this, "Shared", Toast.LENGTH_SHORT).show()
                    true
                }
                R.id.save -> {
                    Toast.makeText(this, "saved", Toast.LENGTH_SHORT).show()
                    true
                }
                R.id.download -> {
                    Toast.makeText(this, "downloaded", Toast.LENGTH_SHORT).show()
                    true
                }
                else -> {
                    true
                }
            }
 
        }
         
        // event on long press on image
        img.setOnLongClickListener {
            try {
                val popup = PopupMenu::class.java.getDeclaredField("mPopup")
                popup.isAccessible = true
                val menu = popup.get(popupMenu)
                menu.javaClass.getDeclaredMethod("setForceShowIcon", Boolean::class.java)
                    .invoke(menu,true)
            }
            catch (e: Exception)
            {
                Log.d("error", e.toString())
            }
            finally {
                popupMenu.show()
            }
            true
        }
    }
}

所以,我们的应用程序已经准备好了。我们可以看到输出。

输出: