Я пытаюсь найти способ создания плавающего контекстного меню, когда элемент во всплывающем меню моего фрагмента длинным нажатием. Когда нажимается значок меню в моем макете, появляется всплывающее меню и отображает список файлов, хранящихся в локальном каталоге приложения. Когда один из этих файлов долго нажат, я хочу, чтобы появилось плавающее контекстное меню, которое дает пользователю возможность переименования или удаления выбранного файла.Android: создание контекстного меню из длинного нажатия на пункт всплывающего меню
В соответствии с Android developer guide плавающие контекстные меню могут быть сгенерированы путем передачи вида (такого как ListView) в registerForContextMenu(). Программист должен затем реализовать onCreateContextMenu() в желаемой деятельности или фрагмент, а именно:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
Я смущен, потому что registerForContextMenu() принимает View
в качестве параметра, но я пытаюсь зарегистрировать контекстное меню все элементы в моем всплывающем меню, а не что-то вроде ListView или GridView. Я включил код PopupMenu ниже. Как я могу достичь плавающего контекстного меню, когда мои пункты всплывающего меню имеют длительное нажатие?
EDIT: Это мой новый код, который генерирует исключение NullPointer на линии «Вид popupMenuItemView =»
trackSelectButton = (Button) v.findViewById(R.id.trackSelect);
trackSelectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
trackListing = getTrackNames();
PopupMenu popup = new PopupMenu(getActivity(), v);
for (int i = 0; i < trackListing.length; i++) { //add a menu item for each existing track
popup.getMenu().add(0,i,0,trackListing[i].getName()); //my attempt to create a resource id (parameter #2) while adding the menu item
popup.getMenu().findItem(i).getActionView().setTag(i); //my attempt to set a tag to a menu item
View popupMenuItemView = getActivity().getWindow().getDecorView().findViewById(i); //nullpointer exception thrown here!
registerForContextMenu(popupMenuItemView); //never reached due to crash
}
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.new_track:
trackSelectButton.setText("...");
Toast.makeText(getActivity(), "Name your new track.", Toast.LENGTH_SHORT).show();
txtTrackName.setVisibility(txtTrackName.VISIBLE);
return true;
default:
selectedTrackName = (item.getTitle().toString());
trackSelectButton.setText(selectedTrackName);
for (int i = 0; i < trackListing.length; i++) { //add a menu item for each existing track
if (trackListing[i].getName().equals(selectedTrackName)) {
selectedTrack = trackListing[i];
AudioRecorder.setFile(selectedTrack);
}
}
return true;
}
}
});
MenuInflater popupInflater = popup.getMenuInflater();
popupInflater.inflate(R.menu.popup_menu_track_selection, popup.getMenu());
popup.show();
}
});
Поскольку я динамически создаю элемент всплывающего меню каждый раз, когда открывается меню (заполняя его файлами, находящимися в каталоге), я никогда не устанавливал идентификаторы меню через xml для элементов всплывающего меню. Нужно ли мне назначать R.ids для пунктов меню каждый раз, когда я создаю свое всплывающее меню или они как-то автоматически генерируются? – Cody
@Cody Было бы лучше в этом случае назначить тег для представления MenuItem - см. Edit –
Не могли бы вы предоставить более полный пример в вашем ответе? Я запутался, прямо сейчас я пытаюсь использовать popup.getMenu(). Add (0, i, 0, trackListing [i] .getName()); и popup.getMenu(). findItem (i) .getActionView(). setTag (i); чтобы установить теги для каждого пункта меню, прежде чем я вызову registerForContextMenu(), но это не кажется правильным. Что я должен переходить в registerForContextMenu, тег? – Cody