Идентификатор нажатого элемента - Android ContextMenu

Добрый день,
У меня есть ListView, заполненный различными текстовыми значениями, и я хочу, чтобы при длительном нажатии и открытии контекстного меню вы могли копировать текст в ListItem, который вы долго нажимали. Пока у меня есть всплывающее контекстное меню с опцией «Копировать»:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
    //this was following another question but I don't know what to do with it
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    long selectedId = info.id;
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context, menu);
}
public boolean onContextItemSelected(MenuItem item)
{
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId())
    {
    case R.id.copy:
        //used to be in a function but wasn't sure about views
        //yes I know it's depreciated but it works ;)
        ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
        TextView clicked = (TextView)this.findViewById(???);
        clipboard.setText(clicked.getText());
        Context context = getApplicationContext();
        Toast copied = Toast.makeText(context, "Story copied to clipboard.", Toast.LENGTH_LONG);
        copied.show();
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}

Спасибо


person ProfSmiles    schedule 08.11.2011    source источник
comment
@Chirag Я не знаю, что поставить, где ??? является. Если бы я мог передать идентификатор долго нажатого элемента, я мог бы просто сделать ...findViewById(id);   -  person ProfSmiles    schedule 08.11.2011


Ответы (2)


Настройте переменную для хранения представления, по которому щелкнули:

View clicked;

Затем присвойте ему значение, когда на нем будет создано контекстное меню:

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
    clicked = v;

    //this was following another question but I don't know what to do with it
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    long selectedId = info.id;
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context, menu);
}

И теперь вы можете использовать его в своем последнем методе:

public boolean onContextItemSelected(MenuItem item)
{
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId())
   {
    case R.id.copy:
        //used to be in a function but wasn't sure about views
        //yes I know it's depreciated but it works ;)
        ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);

        clipboard.setText(clicked.getText());
        // this should work now properly.

        Context context = getApplicationContext();
        Toast copied = Toast.makeText(context, "Story copied to clipboard.", Toast.LENGTH_LONG);
        copied.show();
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}
person Iiro Krankka    schedule 08.11.2011
comment
когда я вставляю это, Eclipse говорит, что это ошибка, и предлагает изменить его на item.getTitle(), однако это просто помещает копию (заголовок контекстного меню, к которому я прикоснулся) в буфер обмена, тогда как я хотел текст того, что было в ListItem я изначально долго нажимал - person ProfSmiles; 08.11.2011
comment
Извини, я виноват. Вы можете сохранить правильный вид в переменной при вызове onCreateContextMenu. Я отредактирую свой ответ. - person Iiro Krankka; 08.11.2011
comment
Используя приведенный выше код, clicked.getText(), по-видимому, является ошибкой: метод getText() не определен для типа View - person ProfSmiles; 08.11.2011

Я думаю, вы сами ответили на свой вопрос. Идентификатор:

long selectedId = info.id;
person Yar    schedule 02.04.2014