【问题标题】:onContextItemSelected doesn't get calledonContextItemSelected 没有被调用
【发布时间】:2011-05-27 01:28:22
【问题描述】:

我制作了一个简单的应用程序,它只显示一个 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" 定义的按钮

【问题讨论】:

    标签: android contextmenu android-alertdialog


    【解决方案1】:

    在这一行之后:

        registerForContextMenu(alert.getListView());
    

    输入这个:

        alert.getListView().setOnCreateContextMenuListener(this);
    

    而不是 onContextItemSelected(MenuItem item) 函数使用这个:

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem menuItem) {
    

    【讨论】:

    • 我只想说我在这个问题上花了很长时间,你的回答是唯一有效的。我首先尝试了其他 20 种左右可能的解决方案。对于那些可能不明白的人,是的,将代码从 onContextItemSelected 移动到 onMenuItemSelected 方法。然后删除 onContextItemSelected 方法。
    【解决方案2】:

    以下函数总是被执行。

     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
    }
    

    【讨论】:

      【解决方案3】:

      只需添加

      @Override
      public boolean onMenuItemSelected(int aFeatureId, MenuItem aMenuItem) {
          if (aFeatureId==Window.FEATURE_CONTEXT_MENU)
              return onContextItemSelected(aMenuItem);
          else
              return super.onMenuItemSelected(aFeatureId, aMenuItem);
      }
      

      【讨论】:

      • 谢谢,过去一周我一直在寻找这个解决方案。
      【解决方案4】:

      我想以 Miki 的回答为基础。

      我只用过

      registerForContextMenu(this.getListView());
      

      this.getListView().setOnCreateContextMenuListener(this);
      

      在我的父 ListActivity 类中。

      我将代码从 onContextItemSelected(MenuItem item) 方法移至 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
      

      并确保在您的子类中,如果您在 super.ListActivity 类的子类中覆盖 onMenuItemSelected,如果您想要包含以下代码在 super.class 中处理的上下文菜单选项。

      @Override
      public boolean onMenuItemSelected(int featureId, MenuItem item) {
        if (<condition>) {
      
          ...
      
        } else {
          return super.onMenuItemSelected(featureId, item);
        }
      }// end onMenuItemSelected
      

      【讨论】:

        【解决方案5】:

        这个问题的真正原因是您覆盖了onContextItemSelected 而没有调用super.onContextItemSelected。将您的 onContextItemSelected 方法更改为:

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

        【讨论】:

        • 如果它甚至没有被调用,那是什么问题??
        猜你喜欢
        • 2016-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多