Intereting Posts
Scala + Android: Кто-нибудь успешно создает и отлаживает Eclipse? Xml pull parser assets xml Пользователь быстро коснется MediaController. Ошибка происходит только на Nexus 4. Лучшая Java Datastructure для хранения ключевой пары значений Обнаружение человеческого голоса из аудиофайла Программный пакет линейного макета Android Разница между фиксацией и применением в Android SharedPreferences При прокрутке списка Android listview выделяется черное выделение текста. Как остановить это? Android, могу ли я поместить AsyncTask в отдельный класс и иметь обратный вызов? Как создать 100% пользовательский DialogFragment Как отправить массив String в качестве базовой пары значений имени как HTTPPOST? AOSP построен на настраиваемом устройстве Как использовать поставщика контента SMS? Где документы? FATAL EXCEPTION: main java.lang.RuntimeException: контент имеет представление с атрибутом id 'android.R.id.list', который не является классом ListView Пользовательский диалог в полноэкранном режиме?

StartActionMode возвращает значение null

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

Есть идеи? Btw, я использую actionbarsherlock

ОБНОВЛЕНИЕ: если я выключу свой телефон или убью приложение и снова запустим приложение, он будет работать … но затем делает то же самое, когда я закрываю его и снова открываю.

Вот мой код: класс 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; } }; 

В моей основной деятельности:

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

В моем адаптере listview:

  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; } } }); 

Solutions Collecting From Web of "StartActionMode возвращает значение null"

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

 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.

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

как это :

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

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

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

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

StartActionMode возвращает null, если он был отменен

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

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

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