PopupMenu Example
In this tutorial you will learn how to create a popupmenu. This type of menu typically gets anchored on a view and gets shown below or above the view depending on the room available and the trigger event.
What is a popupmenu, according to android's documentation.
A PopupMenu displays a Menu in a modal popup window anchored to a View. The popup will appear below the anchor view if there is room, or above it if there is not. If the IME is visible the popup will not overlap it until it is touched. Touching outside of the popup will dismiss it.
Example 1 - Kotlin Popupmenu Example
Here is a simple popupmenu in kotlin android. Follow the following steps to create and run the example.
Step 1: Dependencies.
No special or third party dependency is needed.
Step 2: Create Menu resource file
Create a folder called menu
under the res
directory and in it create a file called popup_menu_button.xml
popup_menu_button.xml
In this file create a menu and in it create the menu items as follows:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/popMenu_Edit"
android:icon="@drawable/ic_edit"
android:title="Edite"/>
<item
android:id="@+id/popMenu_Delete"
android:icon="@drawable/ic_delete"
android:title="Delete"/>
<item
android:id="@+id/popMEnu_Shared"
android:icon="@drawable/ic_share"
android:title="Shared" />
</menu>
Step 3: Create XML Layout
Add a TextView
and a Button
inside a ConstraintLayout
as follows:
activity_main.xm
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="Show popup Menu"
android:textAllCaps="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
Step 4: Create a Popup
Create a class called ShowPopupMenu.kt
and add the code to instantiate the PopupMenu and inflate the menu items and listen to their click events. Here is the full code:
ShowPopupMenu.kt
import android.content.Context
import android.view.View
import android.widget.PopupMenu
import android.widget.Toast
import com.example.simple.show.popmenu.R
class ShowPopupMenu {
fun showPopMenu(context: Context, view: View) {
val pop = PopupMenu(context, view)
pop.inflate(R.menu.pop_menu_button)
pop.setOnMenuItemClickListener {
when (it!!.itemId) {
R.id.popMenu_Edit -> {
Toast.makeText(context, "item Edite", Toast.LENGTH_SHORT).show()
true
}
R.id.popMenu_Delete -> {
Toast.makeText(context, "item Delete", Toast.LENGTH_SHORT).show()
true
}
R.id.popMEnu_Shared -> {
Toast.makeText(context, "item Shared", Toast.LENGTH_SHORT).show()
true
}
else -> false
}
}
try {
val fieldMpopup = PopupMenu::class.java.getDeclaredField("mPopup")
fieldMpopup.isAccessible= true
val mPopup = fieldMpopup.get(pop)
mPopup.javaClass
.getDeclaredMethod("setFoeceShowIcon",Boolean::class.java)
.invoke(mPopup,true)
}catch (e:Exception){
}finally {
pop.show()
}
}
}
Step 5: Laucher Activity
Here is the code for the main activity:
MainActivity.kt
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.example.simple.show.popmenu.R
import com.example.simple.show.popmenu.utility.ShowPopupMenu
class MainActivity : AppCompatActivity() {
lateinit var buttonShowPopupMenu: Button
val showPopMenu = ShowPopupMenu()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Cast()
buttonShowPopupMenu.setOnClickListener {
showPopMenu.showPopMenu(this, it)
}
}
private fun Cast() {
buttonShowPopupMenu = findViewById(R.id.button)
}
}
Step 6: Run
Finally run the project.
Reference
Here are the code reference links:
Number | Link |
---|---|
1. | Download code |
2. | Follow code author |