2013-07-12 2 views
9

Это действительно странно. В первый раз, когда я запускаю приложение в eclipse, и я вызываю startActionMode, все работает нормально. Если я закрою приложение и снова открою его, startActionMode вернет значение null. Он всегда будет возвращать значение null, пока я не изменю что-то в приложении и не запустил его снова из eclipse. В документации говорится, что startActionMode возвращает null, если он был отменен, но он не объясняет, почему он отменен.startActionMode return null

Любые идеи? Кстати, i`m с помощью ActionBarSherlock

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

вот мой код: класс ActionModeCallback:

class ActionModeCallback implements ActionMode.Callback{ 

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

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 

    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 

    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     // TODO Auto-generated method stub 

     return false; 
    } 
}; 

В моей mainactivity:

public ActionMode startActionMode() 
{ 
    mActionMode = startActionMode(new ActionModeCallback()); 
    return mActionMode; 
} 

В моем списке следует адаптер:

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

       MainActivity activity = (MainActivity)rowView.getContext(); 
       if (isChecked) { 

        if(actionmode == null){ 
         actionmode = activity.startActionMode(); 
        }else 
        { 
         actionmode.invalidate(); 
        } 
       } 
       else { 
         activity.finishActionMode(); 
         actionmode=null; 
       } 
      } 
     }); 
+0

Где именно в вашей деятельности вы вызываете startActionMode()? – Christos

+0

Я вызываю это из своего адаптера listview, смотрю на код выше: actionmode = activity.startActionMode(); –

+0

Является ли это родной или совместимый ActionBar (это устройство ICS или выше?). Если это родной, эта строка из официальных документов может быть применима к вам - 'возвращает запущенный ContextMode или null, если он был отменен' – Delyan

ответ

1

Так что я, наконец, нашел обходной путь, который вероятно, НЕ лучшее решение, но я не нашел других решений. Я сделал процесс убийства в onDestroy по моей деятельности.

так:

android.os.Process.killProcess(android.os.Process.myPid()); 

Он сейчас работает. Кажется, мой телефон не очищал память о чем-то.

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

EDIT 2 Я, наконец, нашел источник своей проблемы. Я сохранял статическую переменную одного из моих фрагментов. По какой-то причине эта переменная хранилась в памяти даже при перезапуске приложения. Я до сих пор не знаю точно, почему startActionMode возвращает null. Чтобы исправить это, я создаю экземпляр моей переменной в onCreate своей активности.

1

Ну, я действительно не понимаю, почему это происходит с вами. Но я создал ListView, которые имеют такое же поведение, что и у старого ListView Gmail.

В принципе, пользователь может начать «Режим выбора», долго нажимая один из элементов, а затем пользователь может выбрать другие предметы либо путем длительного нажатия, либо нажатия левой части элемента. Флажок управляется вашим адаптером, делая его видимым в «режиме выбора» и невидимым, когда он не находится в «режиме выбора». Вы также проверяете его, проверяя, выбран ли текущий элемент. Затем вы делаете его не кликабельным, чтобы ListView мог получать события касания.

Если вы хотите, чтобы ListView запускался в «режиме выбора», вы можете установить для selectableFromTheBeginning значение true. И тогда вы делаете CheckBox видимым с самого начала. Я упрости буду использовать и документировать его позже, но я думаю, что он теперь можно использовать.

Вот ссылка на SelectionListView:

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SelectionListView.java

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

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/res/values/attrs.xml

Чтобы использовать его, вы реализуете SelectionListView.SelecionActionModeCallback вместо ActionMode.ActionModeCallback. Не забудьте вызвать методы родителя.

Вы можете использовать его в XML и найти его по ID. Таким образом, вы можете изменить сообщение, которое появляется, когда пользователь выбирает элементы с помощью:

listView.setSelectedStringFormat("%d selected items"); 

Вы устанавливаете реализацию SelectionListView.SelecionActionModeCallback с использованием метода setActionModeCallback.

В вашем адаптере, вы можете сделать что-то вроде этого:

checkBox.setChecked(listView.isItemChecked(position)); 

В вашем ActionModeCallback, вы можете реализовать что-то вроде этого:

public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
    SparseBooleanArray checkedItems = listView.getCheckedItemPositions(); 

    List<Item> selectedItems = new ArrayList<Item>(); 

    for (int i = 0; i < checkedItems.size(); i++) { 
     if (checkedItems.valueAt(i)) { 
      selectedItems.add(yourListOfItems.get(checkedItems.keyAt(i))); 
     } 
    } 

    switch(item.getId()){ 
     case R.id.do_something: 
      doSomething(selectedItems); 
      mode.finish(); 
      break; 
    } 
} 

Ваш флажок будет выглядеть следующим образом:

<CheckBox 
    android:id="@+id/select" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:clickable="false" 
    android:focusable="false" 
    android:focusableInTouchMode="false" /> 

С помощью этого виджета вам не нужно слишком беспокоиться с помощью ActionMode или с помощью способа вы выберете элементы. Прошу прощения за отсутствие документации. Это репозиторий, в который я помещал некоторый код для использования в других проектах. Я планирую его задокументировать. Там есть другие виджеты, которые вы можете посмотреть.

Если вы используете это, пожалуйста, просто уважайте лицензию Apache.

+0

выглядит великолепно, я дам ему попробовать –

+0

Хорошо. Если у вас есть какие-то сомнения, спросите меня. Еще одна вещь: вы можете отслеживать, если ActionMode показывает или нет с обратными вызовами ActionMode. Если вы обнаружите ошибку или думаете, что у нее должна быть другая функция, создайте проблему здесь: http://jira.cybereagle.net/browse/OP. –

+0

У вас есть рабочий список? –

0

startActionMode возвращает нулевое значение, если он был отменен

Глупая идея ... но она будет работать, если вы установите startActionMode на то, что она должна быть установлена ​​на уровне в части вашего приложения, которое обрабатывает то, что происходит, когда вы закрываете приложение?

0
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    MainActivity activity = (MainActivity)rowView.getContext(); 
} 

rowView Здесь должен был buttonView. Возможно, это вызывает ошибку.