6

У меня есть ListFragment, связанный с простым ArrayAdapter. ListView содержит список отмечаемых элементов и его расположение XML выглядит следующим образом:Как правильно инициировать многоэлементную панель контекстного действия для ListFragment (с проблемами)

<ListView android:id="@id/android:list" 
       android:layout_width="match_parent" 
       android:layout_height="0dip" 
       android:layout_weight="1" 
       android:layout_marginLeft="2mm" 
       android:layout_marginRight="2mm" 
       android:drawSelectorOnTop="false" 
       android:longClickable="true" 
       android:choiceMode="multipleChoiceModal"/> 

Как вы можете видеть, я установить long-clickable и choicemode атрибуты в макете XML.

я установить соответствующие слушателей в ListFragment «s onViewCreated обратного вызова:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    ListView list_view = getListView(); 
    list_view.setMultiChoiceModeListener(this); 
    list_view.setOnItemLongClickListener(this); 
} 

Я прохожу в this в качестве параметра слушателя, потому что мой ListFragment также осуществляет обратные вызовы этих слушателей.

Это обратный вызов, я имею проблемы с:

@Override 
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id 
{ 
    activity.startActionMode(this); 
    return true; 
} 

Во-первых, что onItemLongClick никогда не вызывается. Но, панель контекстного действия (CAB) запускается и отлично работает, когда элемент списка длинным щелчком мыши!

Фактически, CAB инициирует должным образом без этого обратного вызова! Мой обратный вызов использует activity.startActionMode(this), который показывает CAB, но не облегчает проверку элементов в списке (я тестировал это в другом месте).

Как правильно программно обрабатывать длинные клики, чтобы инициировать CAB и облегчить проверку элементов списка?

Я использую методы, представленные в разделах Android Developer Guide (они использовались onLongClickListener, которые я также пытался безрезультатно), но он, похоже, не работает.

ответ

1

Я предполагаю, что вы поняли это одно, но для потомков, что вам нужно сделать, чтобы добавить контекстное меню просто добавить пункты контекстного меню в onContextMenuCreated, под корень активности/фрагмента:

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
    ContextMenuInfo menuInfo) { 
    if (v.getId()==R.id.list) { 
    String[] menuItems = getResources().getStringArray(R.array.menu); 
    for (int i = 0; i<menuItems.length; i++) { 
     menu.add(Menu.NONE, i, i, menuItems[i]); 
    } 
    } 
} 

Затем, в контекстном меню заходит под onContextMenuCreated. Вы можете узнать больше здесь:

http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/