onContextItemSelected не запускается при вызове из диалогового окна
Dialog dialog;
private void opendialog() {
dialog = new Dialog(MainActivity.this);
dialog.setContentView(R.layout.popup);
dialog.setTitle(R.string.msettings);
RelativeLayout reply_layout = (RelativeLayout) dialog
.findViewById(R.id.reply_layout);
final RelativeLayout ringtone_layout = (RelativeLayout) dialog
.findViewById(R.id.ringtone_layout);
registerForContextMenu(ringtone_layout);
ringtone_layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openContextMenu(ringtone_layout);
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Select The Action");
menu.add(0, v.getId(), 0, "Edit");
menu.add(0, v.getId(), 1, "Delete");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
System.out.println("Inside onContextItemSelected");
return super.onContextItemSelected(item);
}
onContextItemSelected никогда не вызывается при использовании контекстного меню в диалоговом окне. Что-то не так с моим кодом ? Спасибо заранее..
4 ответов
Примечание: поскольку этот ответ, похоже, привлекает некоторое внимание (upvotes), я редактирую фрагмент кода, чтобы отразить более краткий ответ на вопрос.
вы пытаетесь зарегистрироваться в контекстном меню для элемента представления в диалоговом окне, но из действия. Такой подход неверен. Вам действительно нужно Диалог подкласса, а затем создать и развернуть свои представления там, а затем переопределить onCreateContextMenu (), чтобы выполнить вашу работу и зарегистрировать свое представление для контекстное меню. Затем вы должны создать экземпляр этого диалога здесь. Так что это будет что-то вроде:
public class Mydialog extends Dialog {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.popup);
dialog.setTitle(R.string.msettings);
RelativeLayout reply_layout = (RelativeLayout) findViewById(R.id.reply_layout);
final RelativeLayout ringtone_layout = (RelativeLayout) findViewById(R.id.ringtone_layout);
registerForContextMenu(ringtone_layout);
ringtone_layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openContextMenu(ringtone_layout);
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Select The Action");
menu.add(0, v.getId(), 0, "Edit");
menu.add(0, v.getId(), 1, "Delete");
}
// You should do the processing for the selected context item here. The
// selected context item gets passed in the MenuItem parameter in
// the following method. In my answer I am force calling the onContextItemSelected()
// method but you are free to do the actual processing here itself
@Override
public boolean onMenuItemSelected(int aFeatureId, MenuItem aMenuItem) {
if (aFeatureId==Window.FEATURE_CONTEXT_MENU)
return onContextItemSelected(aMenuItem);
else
return super.onMenuItemSelected(aFeatureId, aMenuItem);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// Avoid using System.out.println() - instead use Android Logging
return super.onContextItemSelected(item);
}
}
Теперь вы можете создать экземпляр этого диалога, и в ваших представлениях будет успешно зарегистрирован элемент контекста. Таким образом, ваш openDialogMethod () теперь будет выглядеть так:
private void opendialog() {
dialog = new MyDialog(MainActivity.this);
// the context menu will now be registered
dialog.show();
}
хотя вы изначально передавали контекст действия в диалог, который вы создавали, вы не можете передать слушателей создания контекстного меню таким образом. Сделать это вам придется подкласс ваш диалог, как я показал выше.
EDIT:
что вы говорите о принудительном вызове контекстного меню на самом деле. Вы просто вызываете обычное меню, а затем передаете этот идентификатор в обратный вызов контекстного меню. Предложение if проходит, так как идентификатор находится в контекстном меню особенность. и после некоторого дальнейшего чтения, похоже, вы должны выполнять обработку меню на onMenuItemSelected (), а не в onContextItemSelected (). Так что у вас сейчас-это правильно и вам не нужно насильно вызывать другой метод. Просто выполните обработку в onMenuItemSelected ().ringtone_layout.setOnCreateContextMenuListener(this);
эта проблема уже решена в следующих потоках SO: onContextItemSelected не вызывается и onContextItemSelected никогда не вызывается с помощью диалога с ListView.
Если ни один из ответов помог вам, попробуйте это:
return false
на onContextItemSelected
метод активность и в фрагментов.
public class MusicsetDialog extends Dialog implements OnClickListener {
private RelativeLayout ringtone_layout;
public MusicsetDialog(Context context) {
super(context);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.music_popup);
setTitle(R.string.msettings);
ringtone_layout = (RelativeLayout) findViewById(R.id.ringtone_layout);
ringtone_layout.setOnClickListener(MusicsetDialog.this);
registerForContextMenu(ringtone_layout);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ringtone_layout:
openContextMenu(ringtone_layout);
break;
default:
break;
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("Select The Action");
// groupId, itemId, order,title
menu.add(0, v.getId(), 0, "Edit");
menu.add(0, v.getId(), 1, "Delete");
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onMenuItemSelected(int aFeatureId, MenuItem aMenuItem) {
if (aFeatureId==Window.FEATURE_CONTEXT_MENU)
return onContextItemSelected(aMenuItem);
else
return super.onMenuItemSelected(aFeatureId, aMenuItem);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// System.out.println("onContextItemSelected");
Log.d("MusicsetDialog", "onContextItemSelected");
return super.onContextItemSelected(item);
}
}
Я создал подкласс для mydialog и расширенного диалога и следовал процедуре Sunil. Но все же onContextItemSelected
не называлась. поэтому после некоторых исследований я Переопределяю onMenuItemSelected
и передал выбранное меню в onContextItemSelected
и он работал нормально. может быть, я звоню onContextItemSelected
силой. Я не знаю. Я новичок в android, любое объяснение, почему onContextItemSelected
по-прежнему не вызывается автоматически, было бы оценено.. Спасибо..
попробуй такое
new AlertDialog.Builder(this)
.setSingleChoiceItems(items, 0, null)
.setPositiveButton(R.string.ok_button_label, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition();
// Do something useful withe the position of the selected radio button
}
})
.show();