onContextItemSelected не вызывается - PullRequest
3 голосов
/ 27 мая 2011

Я сделал простое приложение, которое просто вызывает AlertDialog, с четырьмя элементами в списке. Я регистрирую контекстное меню. Когда я долго нажимаю на один из пунктов, я получаю контекстное меню. Затем я выбираю элемент из контекстного меню, но onContextItemSelected никогда не вызывается. Любая помощь? Спасибо.

test.java:

package com.cerulean.tech.creations.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;

public class test extends Activity {

    private String[] files;
    AlertDialog alert;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        files = new String[4];
    }

    public void selectScheme(View v) {
        files[0] = "<New Scheme>";
        files[1] = "test1";
        files[2] = "test2";
        files[3] = "test3";
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setItems(files, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int item) {
                   }});  
        alert = builder.create();
        alert.show();
        registerForContextMenu(alert.getListView());
    }


    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Context Menu");
        menu.add(0, v.getId(), 0, "Delete");
        menu.add(0, v.getId(), 0, "Cancel");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        return false;
    }
}

В main.xml я просто определил кнопку с android: onClick = "selectScheme"

Ответы [ 5 ]

9 голосов
/ 03 июня 2011

После этой строки:

    registerForContextMenu(alert.getListView());

введите это:

    alert.getListView().setOnCreateContextMenuListener(this);

И вместо функции onContextItemSelected (элемент MenuItem) используйте это:

@Override
public boolean onMenuItemSelected(int featureId, MenuItem menuItem) {
4 голосов
/ 16 июня 2011

Следующая функция всегда выполняется.

 public boolean onMenuItemSelected(int featureId, MenuItem menuItem)

Но вы можете различить контекстные меню и меню параметров, используя следующие флаги:

if (featureId == Window.FEATURE_CONTEXT_MENU)
{
//Do something
}
else if (featureId == Window.FEATURE_OPTIONS_PANEL)
{
//Do something else
}
1 голос
/ 29 августа 2014

Просто добавь

@Override
public boolean onMenuItemSelected(int aFeatureId, MenuItem aMenuItem) {
    if (aFeatureId==Window.FEATURE_CONTEXT_MENU)
        return onContextItemSelected(aMenuItem);
    else
        return super.onMenuItemSelected(aFeatureId, aMenuItem);
}
0 голосов
/ 12 декабря 2013

Я хочу основываться на ответе Мики.

Я использовал только

registerForContextMenu(this.getListView());

и

this.getListView().setOnCreateContextMenuListener(this);

в моем родительском классе ListActivity.

Я переместил свой код из метода onContextItemSelected (элемент MenuItem) в метод onMenuItemSelected .

  @Override
  public boolean onMenuItemSelected(int featureId, MenuItem item) {
    try {
      if (item.getItemId() == R.id.new_entry_menu_option) {

        ...

      }

      ...

      if (item.getItemId() == R.id.quit) {
        /* perform cleanup */
        ...
        return true;
      } else if (item.getItemId() == R.id.delete_entry_context_menu_option) {
        displayConfirmRequest(DELETE_CONFIRMATION_MESSAGE, item);
        return true;
      } else if (item.getItemId() == R.id.2ND_CONTEXT_OPTION) {
        //code for 2nd option
        return true;
      } else if (item.getItemId() == R.id.3RD_CONTEXT_OPTION) {
        //code for 3RD option
        return true;
      } else {
        return super.onMenuItemSelected(featureId, item);
      }// end if/else if/else
    }// end try
    catch (Exception error) {
      //error handler code
      return false;
    }// end try/catch
  }// end onMenuItemSelected

И убедитесь, что в вашем подклассе, есливы переопределяете onMenuItemSelected в подклассе вашего super.ListActivity , чтобы включить следующий код, если вы хотите, чтобы опции contextmenu обрабатывались в super.class.

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
  if (<condition>) {

    ...

  } else {
    return super.onMenuItemSelected(featureId, item);
  }
}// end onMenuItemSelected
0 голосов
/ 02 февраля 2013

Настоящая причина этой проблемы в том, что вы переопределяете onContextItemSelected и не звоните super.onContextItemSelected.Измените свой onContextItemSelected метод на этот:

@Override
public boolean onContextItemSelected(MenuItem item) {
    if (super.onContextItemSelected(MenuItem item))
        return true;
    return false;
}
...