получить идентификатор представления из oncontextitemselected - PullRequest
5 голосов
/ 16 мая 2011

Я зарегистрировал несколько кнопок для контекстного меню

как узнать, какая кнопка была нажата для отображения меню?

ниже приведен псевдокод, который я буду использовать.Мне нужно сделать что-то, связанное с тем, какая кнопка нажата (у меня есть еще несколько кнопок, которые нужно объявить), как я узнаю, что контекстное меню активируется из какой кнопки.

РЕДАКТИРОВАТЬ: я думаю, что я не сделалЯ хотел бы знать, какая кнопка была нажата для отображения меню.Не какой пункт меню нажимается.В любом случае, у меня есть решение, которое я добавлю довольно скоро.

спасибо

private static final int SEND_AS_TEXT = Menu.FIRST;
private static final int SEND_AS_IMAGE = Menu.FIRST + 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        sendAllBtn = (Button)findViewById(R.id.sendAllBtn);
        sendAllBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        registerForContextMenu(v);
        openContextMenu(v);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
        switch(item.getItemId()){
        case SEND_AS_TEXT:
            //do sth related to the button clicked
            break;

        }
        return super.onContextItemSelected(item);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(Menu.NONE, SEND_AS_TEXT, SEND_AS_TEXT, "Send As Text");
        menu.add(Menu.NONE, SEND_AS_IMAGE, SEND_AS_IMAGE, "Send As Image");
    }

Ответы [ 5 ]

12 голосов
/ 17 мая 2011

Хорошо, большое спасибо за помощь от других, которые проясняют мои сомнения относительно getItemId, так как он возвращает идентификатор, который я присвоил пункту меню.В моем случае я хотел знать, какая кнопка была нажата до создания контекстного меню.

Чтобы сделать это, я просто создаю длинную переменную для хранения кнопки, на которую нажали.Идентификатор кнопки можно получить следующим образом:

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    // TODO Auto-generated method stub
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("Send As..");
    menu.add(Menu.NONE, SEND_AS_TEXT, SEND_AS_TEXT, "Send As Text");
    menu.add(Menu.NONE, SEND_AS_IMAGE, SEND_AS_IMAGE, "Send As Image");
    btnId = v.getId(); //this is where I get the id of my clicked button
}

и позже мне нужно будет только обратиться к этому btnId, чтобы сделать все, что я захочу.

4 голосов
/ 21 декабря 2011

Я думаю, что имеет смысл использовать идентификатор конкретного представления.Скажем, у вас есть ListView, заполненный элементами, содержащими ваши данные, но между некоторыми элементами вы создали разделители / заголовки.Вы не хотите, чтобы разделители обрабатывали клики / длинные клики.

В некоторых случаях вполне нормально просто ссылаться на "position" или MenuInfo.id, но в зависимости от вашей структуры данных вам может потребоваться больше контроля.

Что вы можете сделать, это установить идентификаторы для элементов / представлений в вашем ListView (view.setId (x), где x представляет идентификатор / позицию для вашей структуры данных / объекта. Затем при создании ContextMenuи обрабатывая выборки внутри него, сделайте следующее, чтобы прочитать этот идентификатор:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
    int id = info.targetView.getId();

    // now you can refer to your data with the correct ID of yours
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    int id = info.targetView.getId();

    // now you can refer to your data with the correct ID of yours
}
1 голос
/ 29 июля 2011

Если вы ищете идентификатор ваших базовых данных (предоставленных адаптером getItemId(int)), просто добавьте следующие строки в метод onContextItemSelected:

final AdapterView.AdapterContextMenuInfo info = 
  (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
final long datasId = info.id    // get datas id
0 голосов
/ 17 мая 2011

попробуйте это ...

@Override
public boolean onContextItemSelected(MenuItem item)
 {
    if(item.getItemId()==SEND_AS_TEXT)
    {
        //code for send text
    } 
    else if(item.getItemId()==SEND_AS_IMAGE)
    {
       //code for send image
    }
    return super.onContextItemSelected(item);
}
0 голосов
/ 16 мая 2011
@Override
public boolean onContextItemSelected(MenuItem item) {
    item.getItemId();
    return super.onContextItemSelected(item);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...