Android kotlin popup menu

In android, the Menu is an important part of the UI component which is used to provide some common functionality around the application. With the help of the menu, users can experience smooth and consistent experiences throughout the application. In Android, we have three types of Menus available to define a set of options and actions in our android applications. The Menus in android applications are the following:

  • Android Options Menu: Android Options Menu is a primary collection of menu items in an android application and is useful for actions that have a global impact on the search application.
  • Android Context Menu: Android Context Menu is a floating menu that only appears when the user clicks for a long time on an element and is useful for elements that affect the selected content or context frame.
  • Android Popup Menu: Android Popup Menu displays a list of items in a vertical list which presents the view that invoked the menu and is useful to provide an overflow of actions related to specific content.

So in this article, we are going to discuss the Popup Menu. A PopupMenu displays a Menu in a popup window anchored to a View. The popup will be shown below the anchored View if there is room(space) otherwise above the View. If any IME(Input Method Editor) is visible the popup will not overlap it until the View(to which the popup is anchored) is touched. Touching outside the popup window will dismiss it.

Example

In this example, we are going to make a popup menu anchored to a Button and on click, the popup menu will appear, and on a touch of the popup menu item, a Toast message will be shown. A sample GIF is given below to get an idea about what we are going to do in this article. Note that we are going to implement this project using the Java language.

Step By Step Implementation

Step 1: Create a New Project in Android Studio

To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. The code for that has been given in both Java and Kotlin Programming Language for Android.

Читайте также:  Виды маркеров для html

Step 2: Working with the XML Files

Next, go to the activity_main.xml file, which represents the UI of the project. Below is the code for the activity_main.xml file.

Источник

Всплывающее меню Popup Menu в Kotlin Android

Всплывающее меню Kotlin Android (Popup Menu) – это меню со списком, которое отображается вертикально при просмотре. Всплывающее меню появляется под картинкой, если есть место, в противном случае появляется выше. Прикосновение к всплывающему меню заставляет его исчезнуть.

Всплывающее меню предоставляет действия, связанные с конкретным содержимым, и не влияет на соответствующее содержимое.

Интерфейс PopupMenu.OnMenuItemClickListener получает события щелчка элементов меню, если у элементов нет прослушивателя кликов.

Пример всплывающего меню Kotlin Android

В этом примере мы добавим элементы всплывающего меню в представление (кнопку). При нажатии на кнопку отображаются элементы всплывающего меню, над которыми мы можем выполнить соответствующее действие.

Создайте проект Android и выберите Basic Activity в Котлин. Это действие автоматически генерирует коды для меню.

Activity_main.xml

Добавьте следующий код в каталог layout в файле activity_main.xml. Этот код генерируется автоматически при создании основного действия.

content_main.xml

Добавьте следующий код в файл content_main.xml в каталоге макета. В этом макете мы размещаем компонент представления кнопок.

strings.xml

Добавьте следующий код в файл strings.xml.

 Kotlin PopupMenu Settings Cricket Football Hockey 

Создайте файл ресурсов меню с именем popup_menu.xml в каталоге меню. Добавьте тег элемента, который создает элемент меню для всплывающего меню.

MainActivity.kt

Добавьте следующий код в класс MainActivity.kt. В этом классе мы реализуем интерфейс PopupMenu.OnMenuItemClickListener, который получает события щелчка пунктов меню. Чтобы отобразить всплывающее меню, вызовите метод PopupMenu.show().

package example.javatpoint.com.kotlinpopupmenu import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.widget.Button import android.widget.PopupMenu import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) val button = findViewById(R.id.button) button.setOnClickListener < val popupMenu: PopupMenu = PopupMenu(this,button) popupMenu.menuInflater.inflate(R.menu.popup_menu,popupMenu.menu) popupMenu.setOnMenuItemClickListener(PopupMenu.OnMenuItemClickListener < item ->when(item.itemId) < R.id.action_crick ->Toast.makeText(this@MainActivity, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show() R.id.action_ftbal -> Toast.makeText(this@MainActivity, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show() R.id.action_hockey -> Toast.makeText(this@MainActivity, "You Clicked : " + item.title, Toast.LENGTH_SHORT).show() > true >) popupMenu.show() > > >

Источник

PopupMenu — Всплывающее меню

Начиная с Android 3.0, в системе появилась возможность создавать всплывающее меню, привязанное к элементу View. Меню реализовано в виде модального окна, которое отображается снизу от родителя меню или в другом месте, если места снизу недостаточно. PopupMenu не нужно путать с контекстным меню. У них разные задачи, хотя поведение весьма схоже. В новых версиях Android использование всплывающих меню предпочтительнее контекстных, которые можно считать устаревшим интерфейсом.

В Android 4.0 добавили новую функциональность, чтобы работать было проще. В частности, всплывающее меню можно получить из XML-файла, используя метод inflate(int), которому следует передать идентификатор ресурса меню. А до этого приходилось использовать отдельный класс MenuInflator с избыточным кодом.

Читайте также:  Save file to path php

Также появился слушатель PopupMenu.OnDismissListener для работы с закрытием меню. Он срабатывает либо, когда пользователь щёлкает на пункте меню и меню закрывается, либо пользователь щёлкает в другом месте экрана, и меню также закрывается.

Есть момент, который приводит к конфузу. Сейчас существует два класса с одинаковым именем из двух разных пакетов: android.widget и androidx.appcompat.widget (ещё были android.support.v7.widget.PopupMenu и android.support.v4.widget.PopupMenuCompat). Они практически одинаковы в применении, но в паре моментов поведение отличается.

Например, всплывающее меню из AndroidX может быть прокручиваемым. Когда я щёлкал на изображении, то на экран выводилось только два пункта, и для третьего пункта приходилось прокручивать меню.

Создать всплывающее меню очень просто. По сути мы повторяем шаги по созданию обычного меню. Сначала в ресурсах меню создадим нужный файл:

res/menu/popupmenu.xml

Я постарался использовать всевозможные варианты использования атрибутов, которые отвечают за вывод флажков, доступность и т.д. Есть и другие атрибуты, о которых читайте в документации.

Далее добавим на экран активности текстовую метку, кнопку и ImageView. При щелчке на каждом из этих компонентов мы будем выводить одинаковое всплывающее меню:

 package ru.alexanderklimov.popupmenu; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.PopupMenu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.button); TextView textView = findViewById(R.id.textView); ImageView imageView = findViewById(R.id.imageView); button.setOnClickListener(viewClickListener); textView.setOnClickListener(viewClickListener); imageView.setOnClickListener(viewClickListener); >View.OnClickListener viewClickListener = new View.OnClickListener() < @Override public void onClick(View v) < showPopupMenu(v); >>; private void showPopupMenu(View v) < PopupMenu popupMenu = new PopupMenu(this, v); popupMenu.inflate(R.menu.popupmenu); popupMenu .setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() < @Override public boolean onMenuItemClick(MenuItem item) < switch (item.getItemId()) < case R.id.menu1: Toast.makeText(getApplicationContext(), "Вы выбрали PopupMenu 1", Toast.LENGTH_SHORT).show(); return true; case R.id.menu2: Toast.makeText(getApplicationContext(), "Вы выбрали PopupMenu 2", Toast.LENGTH_SHORT).show(); return true; case R.id.menu3: Toast.makeText(getApplicationContext(), "Вы выбрали PopupMenu 3", Toast.LENGTH_SHORT).show(); return true; default: return false; >> >); popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() < @Override public void onDismiss(PopupMenu menu) < Toast.makeText(getApplicationContext(), "onDismiss", Toast.LENGTH_SHORT).show(); >>); popupMenu.show(); > > 

Вам надо создать новый экземпляр PopupMenu, указав контекст активности и компонент, к которому будет привязано это меню. Далее загружаете меню из ресурсов и добавляете методы для обработки щелчков. Для отображения на экране вызывается метод show().

Запустив проект, вы можете щёлкать по любому элементу на форме и увидеть всплывающее меню.

Несмотря на то, что в XML мы указали значки, в реальности они не выводятся. В интернете можно найти примеры решения проблемы через программный код. В Android Q (API 29) можно сделать из коробки (см. пример ниже).

PopupMenu

Меню со значками (Kotlin)

Напишем другой вариант примера на Kotlin и заставим систему выводить значки. Будем вызывать меню при нажатии на кнопку и выводить информацию в TextView через новый объект popupMenu2 из пакета android.widget, у которого есть специальный метод setForceShowIcon() для вывода значков на экран. И для сравнения оставим код из предыдущего примера.

 // Если этот код работает, его написал Александр Климов, // а если нет, то не знаю, кто его писал. package ru.alexanderklimov.popupmenu import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Build import android.os.Bundle import android.widget.Button import android.widget.ImageView import android.widget.PopupMenu import android.widget.TextView import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val imageView: ImageView = findViewById(R.id.imageView) val textView: TextView = findViewById(R.id.textView) val button: Button = findViewById(R.id.button) // старый пример val popupMenu = androidx.appcompat.widget.PopupMenu(this, imageView) popupMenu.inflate(R.menu.popupmenu) popupMenu.setOnMenuItemClickListener < when (it.itemId) < R.id.menu1 -> < textView.text = "Вы выбрали PopupMenu 1" true >R.id.menu2 -> < textView.text = "Вы выбрали PopupMenu 2" true >R.id.menu3 -> < textView.text = "Вы выбрали PopupMenu 3" true >else -> false > > imageView.setOnClickListener < popupMenu.show() >// Вариант с поддержкой значков val popupMenu2 = PopupMenu(this, button) popupMenu2.inflate(R.menu.popup_menu) popupMenu2.setOnMenuItemClickListener < when (it.itemId) < R.id.red -> < textView.background = ColorDrawable(Color.RED) textView.text = "Вы выбрали красный цвет" >R.id.yellow -> < textView.background = ColorDrawable(Color.YELLOW) textView.text = "Вы выбрали жёлтый цвет" >R.id.green -> < textView.background = ColorDrawable(Color.GREEN) textView.text = "Вы выбрали зелёный цвет" >> false > if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) < popupMenu2.setForceShowIcon(true) >button.setOnClickListener < popupMenu2.show() >> > 

Создадим новый файл меню res/menu/popup_menu.xml для второго примера.

Читайте также:  Задание цвета по его названию

PopupMenu со значками

Программное добавление пунктов

Повесим на новую кнопку возможность программного добавления новых пунктов меню.

 public void onClick(View view) < PopupMenu popupMenu = new PopupMenu(this, view); // popupMenu.inflate(R.menu.popupmenu); // если добавлять к существующему меню popupMenu.getMenu().add(1, R.id.menu1, 1, "slot1"); popupMenu.getMenu().add(1, R.id.menu2, 2, "slot2"); popupMenu.show(); >

Источник

Learn how to create a popup menu with icons in this Kotlin Android tutorial!

You will learn how to create a menu resource, how to code the popup menu and then how to show icons in the popup menu. It’s a bit trickier than it may seem!

This post contains all the code that’s been written in this YouTube video.

You can also check out this GitHub repository: https://github.com/ResoCoder/PopupMenuTutorial

MainActivity.kt

package com.resocoder.popupmenutut import android.content.Intent import android.net.Uri import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.support.v7.widget.PopupMenu import android.util.Log import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) imageView_options.setOnClickListener < val popupMenu = PopupMenu(this, it) popupMenu.setOnMenuItemClickListener < item ->when (item.itemId) < R.id.menu_open_website -> < val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://resocoder.com")) startActivity(intent) true >R.id.menu_show_toast -> < Toast.makeText(this, "Showing Toast!", Toast.LENGTH_LONG).show() true >else -> false > > popupMenu.inflate(R.menu.menu_main) try < val fieldMPopup = PopupMenu::class.java.getDeclaredField("mPopup") fieldMPopup.isAccessible = true val mPopup = fieldMPopup.get(popupMenu) mPopup.javaClass .getDeclaredMethod("setForceShowIcon", Boolean::class.java) .invoke(mPopup, true) >catch (e: Exception) < Log.e("Main", "Error showing menu icons.", e) >finally < popupMenu.show() >> > >

Источник

Оцените статью