2016-06-09 6 views
0

Я пытаюсь найти способ создания плавающего контекстного меню, когда элемент во всплывающем меню моего фрагмента длинным нажатием. Когда нажимается значок меню в моем макете, появляется всплывающее меню и отображает список файлов, хранящихся в локальном каталоге приложения. Когда один из этих файлов долго нажат, я хочу, чтобы появилось плавающее контекстное меню, которое дает пользователю возможность переименования или удаления выбранного файла.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(); 
     } 
    }); 

ответ

0

Я не думаю, что есть способ, чтобы установить длинный клик на слушателя все меню. Я бы предложил зарегистрировать каждый элемент вашего всплывающего меню для контекстного меню по отдельности.

Вы можете использовать следующее, чтобы получить вид каждого пункта меню в меню с помощью идентификаторов, установленных на вашем меню XML:

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

затем передать это registerForContextMenu.

registerForContextMenu(menuItemView) 

ли, что для каждого пункта меню, то в вашей перегруженной onContextItemSelected (MenuItem пункта), вы можете использовать переключатель на item.getItemId(), чтобы добавить логику для каждого элемента на основе его ID.

EDIT Поскольку вы добавляете пункты меню программно, было бы лучше, чтобы присвоить метку мнению MENUITEM в. После создания MenuItem вы можете получить представление по menuItem.getActionView().setTag(whatever). Затем используйте menuItem.getActionView().getTag() в onContextItemSelected

+0

Поскольку я динамически создаю элемент всплывающего меню каждый раз, когда открывается меню (заполняя его файлами, находящимися в каталоге), я никогда не устанавливал идентификаторы меню через xml для элементов всплывающего меню. Нужно ли мне назначать R.ids для пунктов меню каждый раз, когда я создаю свое всплывающее меню или они как-то автоматически генерируются? – Cody

+0

@Cody Было бы лучше в этом случае назначить тег для представления MenuItem - см. Edit –

+0

Не могли бы вы предоставить более полный пример в вашем ответе? Я запутался, прямо сейчас я пытаюсь использовать popup.getMenu(). Add (0, i, 0, trackListing [i] .getName()); и popup.getMenu(). findItem (i) .getActionView(). setTag (i); чтобы установить теги для каждого пункта меню, прежде чем я вызову registerForContextMenu(), но это не кажется правильным. Что я должен переходить в registerForContextMenu, тег? – Cody