одновременное использование onTouch и onCreateContextMenu

#android

#Android

Вопрос:

Я хочу зафиксировать координаты события касания пользователя (для этого я реализовал onTouch метод), но я также хочу отображать контекстное меню, когда пользователь прикасается к экрану.

При использовании обоих методов onTouch и onCreateContextMenu каждое событие касания отправляется onTouch методу. onCreateContextMenu Метод никогда не вызывается. Я думаю, это ожидаемо. Затем я попытался вручную отобразить контекстное меню, вызвав openContextMenu(v) в onTouch методе, это работает, но меню не исчезает с экрана после onContextItemSelected(MenuItem item) вызова. Итак, как я могу заставить это работать?

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.record_match);
    myCourtView = new MyImageView(getApplicationContext());
    ll = (LinearLayout)findViewById(R.id.linearLayout);
    ll.addView(myCourtView, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    registerForContextMenu(myCourtView);
    myCourtView.requestFocus();
    myCourtView.setOnTouchListener(this);

}// End OnCreate


    // Implement the OnClickListener callback
   public boolean onTouch(View v, MotionEvent event) {
      //do something when user interacts with the court view
      myCourtView.processEvent(event);
      openContextMenu(v);
      myCourtView.invalidate();
      return true;
    }//End OnClickListener

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);
  MenuInflater inflater = getMenuInflater();
  inflater.inflate(R.menu.shot_entry_menu, menu);
}//End onCreateContextMenu

@Override
public boolean onContextItemSelected(MenuItem item) {
  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
  switch (item.getItemId()) {
  case R.id.player_1:
    //do something
    return true;
  case R.id.player_2:
    //do something else
    return true;
  }
  return true;
}//End onContextItemSelected
  

Ответ №1:

вы должны возвращать false в onTouch:

True, если прослушиватель использовал событие, false в противном случае.

Ответ №2:

Для меня это решение работает:

 myCourtView.setOnTouchListener(new OnTouchListener()
    {public boolean onTouch(View v, MotionEvent ev)
        {});
  

Остальное то же самое

Ответ №3:

попробуйте поместить это в общедоступное логическое onTouch после возврата true; registerForContextMenu(this.getListView());