2010-06-17 12 views
1

Возможно ли создать динамическое контекстное меню в android?Параметры динамического контекстного меню

Что я имею в виду, например, если у меня есть список элементов, которые могут быть в двух состояниях: «читать» и «непрочитывать». Я хочу иметь возможность отображать контекстное меню с опцией «Отметить как прочитанное» для непрочитанных элементов и «Отметить как непрочитанное» для прочитанных элементов.

Так нажав на:

> read 
> unread <-- click 
> read 

покажет контекстное меню "Отметить как прочитанное" в результате:

> read 
> read 
> read <-- click 

появится меню "Отметить как непрочитанное".

Есть ли какая-то функция, которая позволяет мне настроить создание контекстного меню непосредственно перед его отображением?

Любая помощь приветствуется!

ответ

5

Как вы не предоставить код, это является основным подходом:

@Override 
public void onCreateContextMenu(ContextMenu contextMenu, 
           View v, 
           ContextMenu.ContextMenuInfo menuInfo) { 
    AdapterView.AdapterContextMenuInfo info = 
      (AdapterView.AdapterContextMenuInfo) menuInfo; 

    String actionString = "Mark as Read"; 

    // if it's alredy read 
    if (((TextView) info.targetView).getText().toString().equals("read")) 
     actionString = "Mark as Unread"; 

    menu.setHeaderTitle("Action"); 
    menu.add(0, 0, 0, actionString); 
} 

В этом случае, я предполагаю, что список заполняется TextView с, что может иметь строку «читать» или «непрочитанный». Как я уже сказал, это очень простой подход. Здесь важно заметить, как используется объект ContextMenu.ContextMenuInfo.

Кроме того, чтобы прочитать состояние выбранного элемента, вы можете использовать метод item.getMenuInfo() внутри метода onContextItemSelected(MenuItem item).

+0

Что представляет элемент .targetView? Спасибо! – drozzy

+0

Когда вы создаете список на Android, каждый элемент в списке является 'View'. Вы можете использовать разные типы представлений, например простой «TextView» (как в примере выше) или пользовательский вид (например, внешний макет в XML с помощью «LinearLayout», различные «TextView's, Images, и т.д). «TargetView» представляет собой «Просмотр», который используется для отображения каждого элемента в списке. – Cristian

1

Как я хотел бы сделать это, чтобы создать два отдельных пунктов меню «Отметить как прочитанное» и «Отметить как непрочитанное», а затем скрыть одну из них всякий раз, когда отображается меню:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
           ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu, menu); 
    if (<is unread>) 
     menu.findItem(R.id.mark_unread).setVisible(false); 
    else 
     menu.findItem(R.id.mark_read).setVisible(false); 
} 

Установка текст (и особенно чтение текста) непосредственно из кода хрупкий; текст может измениться, и что, если вы хотите поддерживать несколько языков?

Смежные вопросы