2016-06-09 100 views
0

我試圖找到一種方法來創建一個浮動上下文菜單,當我的片段的彈出菜單中的項目是長按。當我的佈局中的菜單圖標被點擊時,彈出菜單出現並顯示存儲在本地目錄中的文件列表到應用程序。當其中一個文件被長時間按下時,我想要出現一個浮動的上下文菜單,使用戶可以選擇重命名或刪除選定的文件。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(); 
     } 
    }); 

回答

0

我不認爲有一種方法來設置一個長點擊監聽器整個菜單。我建議單獨爲上下文菜單註冊每個彈出式菜單項。

您可以使用下面的方法獲得你的菜單中的每個菜單項的查看使用您設置的ID在你的菜單中的xml:

View menuItemView = getActivity().getWindow().getDecorView().findViewById(R.id.item_id); 

然後它傳遞給registerForContextMenu。

registerForContextMenu(menuItemView) 

做到這一點對每個菜單項,然後在您的重寫onContextItemSelected(菜單項的項目),你可以使用item.getItemId()開關添加邏輯基於其ID的每個項目。

編輯 既然你編程添加菜單項,這將是更好地分配標籤的菜單項的觀點。創建MenuItem之後您可以通過menuItem.getActionView().setTag(whatever)獲取視圖。然後使用menuItem.getActionView().getTag()onContextItemSelected

+0

由於我動態創建一個彈出菜單項每次打開菜單(填充文件中找到的文件)我從來沒有設置通過XML的菜單ID爲彈出菜單項。每次生成我的彈出式菜單時,是否需要將R.ids分配給菜單項?或者它們以某種方式自動生成? – Cody

+0

@Cody在這種情況下,將一個標籤分配給MenuItem的視圖會更好 - 請參閱編輯 –

+0

您能否在您的答案中提供更完整的示例?我很困惑,現在我試圖使用popup.getMenu()。add(0,i,0,trackListing [i] .getName());和popup35.getMenu()。findItem(i).getActionView()。setTag(i);和 popup.getMenu()。在我調用registerForContextMenu()之前設置每個菜單項的標籤,但這看起來不正確。我應該傳遞給registerForContextMenu,標籤? – Cody