Где можно найти пример реализации ContextMenu в приложении Android?

Мне нужно создать контекстное меню, которое не зависит от активности. Хотя можно сделать и зависимым, но в этом случае класс станет зависимым от активности. Я уже около часа ищу реализацию, но даже в AOSP не смог найти ничего подходящего. Я наткнулся на класс ContextMenuBuilder, но он не был завершен. <br/> <br/> Для меня важно получить реализацию из androidx или MaterialDesign, чтобы меню использовало цвета, настроенные в themes.xml.
  • 18 ноября 2024 г. 4:53
Ответы на вопрос 2
Создание контекстного меню, не зависящего от активности, можно реализовать с помощью класса `PopupMenu` в Android. Этот класс позволяет вам создавать контекстные меню, которые можно использовать в любом месте вашего приложения. 

Ниже представлен пример, который демонстрирует, как создать `PopupMenu` в вашем приложении и использовать цвета из ваших тем:

1. Во-первых, убедитесь, что вы добавили зависимости для Material Components, если вы планируете использовать Material Design:

```groovy
implementation 'com.google.android.material:material:1.7.0'
```

2. Затем вы можете создать класс, который будет отвечать за отображение контекстного меню. Например:

```kotlin
import android.content.Context
import android.view.MenuItem
import android.view.PopupMenu
import android.view.View
import androidx.appcompat.widget.PopupMenu

class CustomContextMenu(private val context: Context, private val anchor: View) {

    fun showMenu() {
        val popupMenu = PopupMenu(context, anchor)
        popupMenu.menuInflater.inflate(R.menu.context_menu, popupMenu.menu)

        // Здесь вы можете установить обработчик кликов для пунктов меню
        popupMenu.setOnMenuItemClickListener { item: MenuItem ->
            when (item.itemId) {
                R.id.menu_item_1 -> {
                    // Действие для первого пункта
                    true
                }
                R.id.menu_item_2 -> {
                    // Действие для второго пункта
                    true
                }
                else -> false
            }
        }
        
        // Показать контекстное меню
        popupMenu.show()
    }
}
```

3. Создайте файл ресурсов меню `res/menu/context_menu.xml`:

```xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_item_1"
        android:title="Первый пункт" />
    <item
        android:id="@+id/menu_item_2"
        android:title="Второй пункт" />
</menu>
```

4. В вашей активности или фрагменте вы можете создать экземпляр `CustomContextMenu` и вызвать метод `showMenu()` в нужный момент, например, в обработчике клика на вид:

```kotlin
val anchorView = findViewById<View>(R.id.your_view) // Замените на ваш вид
val contextMenu = CustomContextMenu(this, anchorView)

anchorView.setOnLongClickListener {
    contextMenu.showMenu()
    true
}
```

Таким образом, вы можете использовать `PopupMenu` как контекстное меню, которое не зависит от активности и имеет доступ к ресурсам вашего приложения, включая стили и цвета из `themes.xml`.

Если коротко, то мне нужно создавать контекстное меню, без активности.

Я не знаю зачем Вам это, но сам добавляю пункт "Печатать" в меню выделенного текста так
<activity
            android:name=".ui.TextActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:label="@string/label_text">
            <intent-filter>
                <action android:name="android.intent.action.PROCESS_TEXT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>

Как это сделать без активити ? Думаю никак. В 13-ом таймаут до ANR, если активити не получит фокус в видимый на экране элемент урезали по самые гланды.

Или Вы про android.view.ContextMenu ?
Не уверен, что его перенесли в androidx. Никогда не использовал, мне хватало типа диалог и комбобокса.

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