2012-03-02 6 views
25

В попытке следовать рекомендациям по разработке Android, я столкнулся с небольшим затруднением.Панель контекстного действия для Android

Я хочу иметь список предметов, которые я могу долго нажать несколько (multi-select), а затем выполнить массовые действия над ними.

Руководства по дизайну предлагают использовать панель контекстного действия для этого, и это звучит совершенно так, как я имел в виду. Проблема в том, что я пытаюсь поддерживать совместимость в обратном направлении до API 7 (из-за моего телефона в настоящее время 2.3.3).

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

+0

Привет, вы проверили исходный код образца, есть также примеры кнопок добавления, контекстные кнопки ..etc https://github.com/JakeWharton/ActionBarSherlock/tree/master/samples/demos –

+2

Да, я посмотрел на классы в этой папке, я не видел примеров, о которых вы говорите. Единственные примеры, которые я видел в добавлении вещей, выполняются на шаге создания OptionsMenu, но я хочу сделать это в ответ на длинный щелчок по элементу (логически контекстуальная вещь). Можете ли вы сказать мне, в каком файле вы его видели? – Paul

+0

Вот как я сделал это http://stackoverflow.com/questions/14737519/implementing-multi-selection-and-contextual-actionmode-in-actionbarsherlock/14737520#14737520 –

ответ

16

Настройка контекстную ActionBar это же к настройке «регулярные» пункты ActionBar насколько XML обеспокоен. This example in the developer's guide explains it all.

Чтобы использовать ActionBarSherlock, замените обратные вызовы Android по умолчанию на обработанные ActionBarSherlock обратные вызовы (например, вместо Android.View.ActionMode, используйте com.actionbarsherlock.view.ActionMode).

+1

, что пространство имен не существует, насколько я могу судить. – Paul

+2

Вы используете v4.0 ActionBarSherlock? На прошлой неделе он вышел из беты. – Reinier

+0

Обновление до 4.0 добавит пространства имен, которые вам не хватает. – Reinier

1

Для длинного щелчка образца см. Ниже ссылки. Первый - это Java-код, необходимый для образца. А второй - как определить макет;

+1

Это не имеет никакого отношения к моему вопросу. В этом примере показано, как отобразить контекстное меню из фрагмента. Я пытаюсь реплицировать панель контекстного действия из более современных API. – Paul

0

Отвечу вторую часть вашего вопроса. Вот пример того, как добавить любой вид экземпляра (кнопка в коде ниже) ActionBar с библиотекой ActionBarSherlock:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

     refreshButton = (RotatingButton) LayoutInflater.from(this).inflate(R.layout.actionbar_customview_refresh, null); 
     refreshButton.setOnClickListener(refreshButtonListener); 

     MenuItem item = menu.add(0, android.R.id.copy, 0, getString(R.string.actionbar_refresh)); 
     item.setActionView(refreshButton); 
     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main_activity_action_bar, menu); 
} 
+0

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

0

Я столкнулся с той же проблемой. Это было решено, когда я нашел this link. В принципе, вам нужно создать класс обратного вызова, который реализует ActionMode.Callback. В этом классе вы надуваете панель действий своей контекстной панелью действий. При каждом выборе (или длительном нажатии) вы начинаете обратный вызов с использованием метода startActionMode. Смотрите ссылку для рабочего кода =]

EDIT: Существует также пример на образцах Шерлока под /samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java

22

Это поздний ответ, но я думаю, что бы помочь людям застряли.

Открытие бар контекстных действий на самом деле довольно просто, в любой момент в вашей деятельности вы просто должны позвонить:

startActionMode(mActionModeCallback); 

Если вы не в своей основной деятельности, как и в фрагментах, вы можете получить Обращение с

getSherlockActivity().startActionMode(mActionModeCallback); 

и это обратный вызов

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback(){ 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      MenuInflater inflater = mode.getMenuInflater(); 
      inflater.inflate(R.menu.actionbar_context_menu, menu); 
      return true; 
     } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 

    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_item1: 
       return true; 
      case R.id.menu_item2: 
       //close the action mode 
       //mode.finish(); 
       return true; 
      default: 
       mode.finish(); 
       return false; 
     } 
    } 
}; 

XML-это простое меню, как ActionBar одно:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:id="@+id/menu_item1" 
     android:icon="@drawable/ic_item1" 
     android:title="@string/ITEM1" 
     android:showAsAction="always|withText" /> 

<item android:id="@+id/menu_item2" 
     android:icon="@drawable/ic_item2" 
     android:title="@string/ITEM2" 
     android:showAsAction="always|withText" /> 

+1

Ничего себе симпатичный тент, с этим боролись пару часов! отличная работа – Francois

2

ActionBarSherlock имеет свою собственную реализацию ActionMode, но вам придется Мануалы Controll свою lifesycle, я написал tutorial об этом.