我試圖找到一種方法來創建一個浮動上下文菜單,當我的片段的彈出菜單中的項目是長按。當我的佈局中的菜單圖標被點擊時,彈出菜單出現並顯示存儲在本地目錄中的文件列表到應用程序。當其中一個文件被長時間按下時,我想要出現一個浮動的上下文菜單,使用戶可以選擇重命名或刪除選定的文件。Android:從長按彈出菜單項創建上下文菜單項
根據Android developer guide,可以通過將View(如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代碼。當我的彈出式菜單項被長時間按下時,如何才能實現浮動上下文菜單?
編輯:這是我的新代碼,它拋出一個空指針異常的「查看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的菜單ID爲彈出菜單項。每次生成我的彈出式菜單時,是否需要將R.ids分配給菜單項?或者它們以某種方式自動生成? – Cody
@Cody在這種情況下,將一個標籤分配給MenuItem的視圖會更好 - 請參閱編輯 –
您能否在您的答案中提供更完整的示例?我很困惑,現在我試圖使用popup.getMenu()。add(0,i,0,trackListing [i] .getName());和popup35.getMenu()。findItem(i).getActionView()。setTag(i);和 popup.getMenu()。在我調用registerForContextMenu()之前設置每個菜單項的標籤,但這看起來不正確。我應該傳遞給registerForContextMenu,標籤? – Cody