2011-01-02 3 views
1

У меня есть стандартный код для ContextMenu (долгое нажатие на пункт ListView), но я создал этот класс (помощник Dialog) и не зарегистрируетContextMenu в диалоге

onContextItemSelected 

метод, я понятия не имею, почему. В чем проблема? =/ В моем макете XML у меня есть обычный ListView с @ + id/list (Я не расширяю ListActivity).

public class CheckListDialog extends Dialog implements OnClickListener { 
public CheckListDialog(Context context) { 
    super(context); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    mainContext = context; 

    setContentView(R.layout.dialog_check_list); 

    list = (ListView) findViewById(R.id.list); 
    registerForContextMenu(list); 

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      doSomething(); // This IS working. 
     }   
    }); 
} 

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

    // This IS working. 

    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo; 
    menu.setHeaderTitle("Something"); 
    String[] menuItems = mainContext.getResources().getStringArray(R.array.menu); 
    for (int i = 0; i<menuItems.length; i++) { 
     menu.add(Menu.NONE, i, i, menuItems[i]); 
    } 
    } 
} 

// This IS NOT working! (Method isn't called at all) 
@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); 
    int menuItemIndex = item.getItemId(); 

    String[] menuItems = mainContext.getResources().getStringArray(R.array.menu); 
    String menuItemName = menuItems[menuItemIndex]; 

    if (menuItemName.equals("Delete")) { 
     doSomething(); 
    } 

    return true; 
} 

@Override 
public void onContextMenuClosed(Menu menu) { 
    doSomething(); 
} 

private ListView list; 

}

ответ

1

После этой строки: registerForContextMenu (список);

это: list.setOnCreateContextMenuListener (this);

И вместо onContextItemSelected (пункт MenuItem) использование функции следующим образом:

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

Другой возможный вариант для вызова поддельный контекстное меню (другое диалоговое окно предупреждения со списком выбираемых пунктов)

@Override 
protected Dialog onCreateDialog(int id) { 
switch (id) { 
    case CONTEXTMENU_DIALOG: { 
    AlertDialog a = new AlertDialog.Builder(myActivity.this) 
    .setItems(R.array.contextmenuitems, 
      new DialogInterface.OnClickListner() { 
       public void onClick(DialogInterface dialog, int whichbutton) { 
       switch (whichbutton) { 
        case 0:{ 
        doSomething(); 
        dialog.dismiss(); 
        return; 
        } 
       } 
       } 
     }).create; 
     a.show(); 
     return a; 
    } 

    case MY_DIALOG:{ 
     //create your dialog here 
    } 
} 
} 
@Override 
protected void onPrepareDialog(int id, Dialog dialog) { 
    switch (id) { 
    case MY_DIALOG:{ 
     list = (ListView) findViewById(R.id.list); 
     list.setOnItemLongClickListener(new OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       showDialog(CONTEXTMENU_DIALOG); 
       return true; 
      }   
     }); 
    } 
    } 
} 
2

Вам нужно реализовать только следующую функцию. Это будет работать.

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) 
{ 
    Log.e(LOGTAG, "Tao menu"); 
    if(v == expList) 
    { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     //AdapterContextMenuInfo aInfo = (AdapterContextMenuInfo) menuInfo; 

     // We know that each row in the adapter is a Map 
     //HashMap map = (HashMap) simpleAdpt.getItem(aInfo.position); 
     menu.setHeaderTitle("Options"); 
     menu.add(1, 1, 1, "Reprint"); 
     menu.add(1, 2, 1, "Void"); 

     menu.getItem(0).setOnMenuItemClickListener(new OnMenuItemClickListener() 
     { 
      public boolean onMenuItemClick(MenuItem clickedItem) 
      { 

       return true; 
      } 
     }); 

     menu.getItem(1).setOnMenuItemClickListener(new OnMenuItemClickListener() 
     { 
      public boolean onMenuItemClick(MenuItem clickedItem) 
      { 

       return true; 
      } 
     }); 
    } 
} 
Смежные вопросы