2011-05-27 103 views
3

我已經做了一個簡單的應用程序,只是提出了一個AlertDialog,列表中有四個項目。我註冊一個上下文菜單。當我長時間點擊其中一個項目時,我會看到上下文菜單。然後我從上下文菜單中選擇一個項目,但onContextItemSelected永遠不會被調用。任何幫助?謝謝。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中,我只用機器人中定義的按鈕:的onClick = 「selectScheme」

回答

9

此線之後:

registerForContextMenu(alert.getListView()); 

類型這:

alert.getListView().setOnCreateContextMenuListener(this); 

,而不是onContextItemSelected(菜單項項)功能使用:

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

我只想說,我花了在這個問題上很長一段時間,你的答案是唯一一個已經工作。我首先嚐試了其他20種左右的解決方案。對於那些可能不明白的人,是的,將代碼從onContextItemSelected移動到onMenuItemSelected方法。然後刪除onContextItemSelected方法。 – Bryan 2013-12-12 07:59:49

4

下面的函數總會被執行。

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

這個問題的真正原因是,你重寫onContextItemSelected,而不是調用super.onContextItemSelected。您onContextItemSelected方法改成這樣:

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

如果它甚至沒有被調用,那麼這是怎麼回事? – tyczj 2013-04-10 14:33:11

0

我要建立在三木的回答。

我只是在我父ListActivity類使用

registerForContextMenu(this.getListView()); 

this.getListView().setOnCreateContextMenuListener(this); 

我感動從onContextItemSelected(菜單項項)我的代碼方法將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,包括下面的代碼,如果你想在文本菜單選項,在超級處理。類。

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

    ... 

    } else { 
    return super.onMenuItemSelected(featureId, item); 
    } 
}// end onMenuItemSelected 
1

只需添加

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

謝謝,我一直在尋找這個解決方案。 – 2015-04-18 09:35:20