Android ContextMenu для просмотра (не активность) - PullRequest
3 голосов
/ 12 августа 2011

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

Это не мероприятие, поэтому я не могу сделать это:

  @override
  public boolean onOptionsItemSelected(MenuItem item) {

Вот код

 private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {

    @Override
    public void onCreateContextMenu(ContextMenu arg0, View arg1,
            ContextMenuInfo arg2) {
        // TODO Auto-generated method stub
        arg0.add(0, 0, 0, "Call");
        arg0.add(0, 1, 0, "Map");
        arg0.add(0, 2, 0, "Market");


    }


};

Обновление:

Воточень упрощенная версия моего класса.

 public final class NewView extends View {



 public NewView(Context context, AttributeSet attrs) {
    super(context, attrs);
    cntxt = context;
    this.setLongClickable(true);
    this.setOnLongClickListener(vLong);
    this.setOnCreateContextMenuListener(vC);


 }

private View.OnLongClickListener vLong = new View.OnLongClickListener() {
    public boolean onLongClick(View view) {
        showContextMenu();
             return true;   
    }
 };  
 private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {

    @Override
    public void onCreateContextMenu(ContextMenu arg0, View arg1,
            ContextMenuInfo arg2) {
        // TODO Auto-generated method stub
        arg0.add(0, 0, 0, "Call");
        arg0.add(0, 1, 0, "Map");
        arg0.add(0, 2, 0, "Market");


    }

};


  } 

Ответы [ 5 ]

3 голосов
/ 31 мая 2013

Никто, кажется, не дает исчерпывающего ответа на вопрос TS (и мой в конечном итоге), поэтому позвольте мне опубликовать решение этого вопроса. Учитывая приведенный выше код, вы можете прикрепить пользовательские обработчики кликов MenuItem:

private View.OnCreateContextMenuListener vC = new View.OnCreateContextMenuListener() {

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

        menu.add(0, 0, 0, "Call")
                .setOnMenuItemClickListener(mMenuItemClickListener);
        menu.add(0, 1, 0, "Map")
                .setOnMenuItemClickListener(mMenuItemClickListener);
        menu.add(0, 2, 0, "Market")
                .setOnMenuItemClickListener(mMenuItemClickListener);

    }
};  

private OnMenuItemClickListener mMenuItemClickListener = new OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem item) {

            switch (item.getItemId()) {
            case 0:
                // do "Call"
                return true;

            case 1:
                // do "Map"
                return true;

            case 2:
                // do "Market"
                return true;
            }

            return false;
        }
    };
};
2 голосов
/ 12 августа 2011

Используйте item.getItemId() и создайте switch и cases на основе числа, возвращенного getItemId()

Примерно так.

 @override
  public boolean onOptionsItemSelected(MenuItem item) {

      switch(item.getItemId())
      {
         case 1:
               Log.i("FIRST ITEM: ", "CALL");
               break;
         case 2: 
                Log.i("2nd ITEM: ", "MAP");
                break;
          case 3:
               Log.i("3rd ITEM: ", "Market");
               break;
         default:
      }
}

Надеюсь, это то, что вы имели в виду, когда реагировали на выбор пунктов меню. :)

1 голос
/ 30 августа 2013

Это кажется странным несоответствием в Android - View может создавать контекстное меню, но обработка этого меню может происходить только в совершенно другом коде?

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

    public void onCreateContextMenu(final ContextMenu menu, final View v,
            final ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        final MenuInflater menuInflater = this.menuInflater;
        menuInflater.inflate(R.menu.context_date, menu);

        final int length = menu.size();
        for (int index = 0; index < length; index++) {
            final MenuItem menuItem = menu.getItem(index);
            menuItem.setOnMenuItemClickListener(this);
        }
    }
0 голосов
/ 16 февраля 2015

В виде :
Пусть ваш взгляд реализует ContextMenuInfo

public class MyView extends View implements ContextMenuInfo

Затем переопределите getContextMenuInfo, чтобы вернуть ваше представление.

@Override
protected ContextMenuInfo getContextMenuInfo() {
    return  this ;
}

В вашей деятельности :
Зарегистрируйте ваше представление для ContextMenu.

registerForContextMenu(myView);

Затем получите доступ к представлению в вашей активности onContextItemSelected.

    public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        ...
        case R.id.action_ctx_wordview_read_tts:
             MyView myView = (MyView) item.getMenuInfo();
        ...
    }
}

Примечание :
Когда я добавил onClickListener в MyView, contextMenu перестал работать. Мне пришлось добавить следующий код, чтобы решить эту проблему.

  tvWord.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            return false;
        }
    });
0 голосов
/ 12 августа 2011

Вы можете присвоить переменную своему View из своей деятельности после того, как вы раздули основной макет (в `onCreate).

myView = (View) findViewById(R.id.my_view);

Далее, сделайте registerForContextMenu(myView);

Наконец, вы можете переопределить onCreateContextMenu, где вы можете добавить то, что происходит, когда появляется контекстное меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...