У меня есть свой стандартный код для ContextMenu (долгое нажатие на элементе ListView), но я создал этот класс (helper Dialog) и не регистрирует
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;
}
Вам нужна только следующая функция. Он будет работать.
@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;
}
});
}
}
Другой возможный вариант для вызова поддельного контекстного меню (другое диалоговое окно предупреждения со списком выбираемых элементов)
@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;
}
});
}
}
}
После этой строки: registerForContextMenu (список);
введите это: list.setOnCreateContextMenuListener(это);
И вместо функции onContextItemSelected (MenuItem item) используйте это:
@Override
public boolean onMenuItemSelected(int featureId, MenuItem menuItem) {