Intereting Posts
Admob с Android: невозможно разобрать андроид: configChanges в манифесте Android Curved Listview Android Сохранение созданных растровых изображений в каталог на SD-карте Приложение с несколькими пользователями в одном устройстве – Абонентская подписка Inapp В Eclipse Juno нет кнопки «Выполнить» или «Панель инструментов» Android: бинация Inapp: ошибка ответа: 7: элемент уже принадлежит PictureListener и onNewPicture () устарели – альтернативы? Синхронизация слайдов проекта Android Wear Лучшая практика для расчета средней скорости от координат GPS ListView с текстовыми окнами, завернутыми горизонтально заполненными динамически Android – Регистрация широковещательного приемника для двух целей? Черный фон на изображении, загружаемом загрузчиком изображений Ионный 2: Запустите фоновый сервис с кордорой Удаление строк android sqlite старше x дней Обновите Android SDK Tool до 22.0.4 (последняя версия) с 22.0.1

Фрагмент уже активен – при попытке setArguments

Я использую пример в приведенной ниже ссылке

http://android-er.blogspot.in/2013/04/handle-onlistitemclick-of-listfragment.html

Здесь у меня есть два класса, которые расширяют фрагмент фрагмента и другие расширяющиеся фрагменты. Теперь я передаю объект detailfragment следующим образом:

* From ListFragment *

@Override public void onListItemClick(ListView l, View v, int position, long id) { Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); Bundle bundle = new Bundle(); bundle.putSerializable(BUNDLE_KEY, obj);// passing this object detailFragment.setArguments(bundle); detailFragment.setUpLayout();// update the UI } 

Теперь в классе Fragment я получаю его, основной целью является обновление пользовательского интерфейса фрагмента на основе элемента, выбранного в фрагменте списка, это причина, по которой я отправляю объект

 Bundle b = getArguments(); b.getSerializable(BUNDLE_KEY); 

Теперь на выбранном элементе сказано: «Фрагмент уже активен».

В чем проблема? Что я делаю не так?

Solutions Collecting From Web of "Фрагмент уже активен – при попытке setArguments"

Другое решение – создать пустой конструктор для вашего фрагмента.

 public Detailfragment() { super(); // Just to be an empty Bundle. You can use this later with getArguments().set... setArguments(new Bundle()); } 

И в методе onListItemClick вы используете этот пакет:

 @Override public void onListItemClick(ListView l, View v, int position, long id) { Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); // Update the keys. detailFragment.getArguments().putSerializable(BUNDLE_KEY, obj);// passing this object detailFragment.setUpLayout();// update the UI } 

Теперь вы можете вызвать метод getArguments () в методе setUpLayout ().

Из официальной версии Android для разработчиков:

Public void setArguments (Bundle args) Поставьте аргументы построения для этого фрагмента. Это может быть вызвано только до того, как фрагмент был привязан к его активности; То есть вы должны вызвать его сразу после создания фрагмента. Аргументы, приведенные здесь, будут сохраняться через уничтожение и создание фрагментов.

Ваш фрагмент уже привязан к своей деятельности, я предлагаю вам использовать свой собственный метод, вам не нужны setArguments!

Создайте собственные аргументы setUIArguments (Bundle args) внутри класса фрагмента и обновите интерфейс фрагмента внутри этого метода

Вы вызовете этот метод таким образом:

 @Override public void onListItemClick(ListView l, View v, int position, long id) { Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); Bundle bundle = new Bundle(); bundle.putSerializable(BUNDLE_KEY, obj);// passing this object detailFragment.setUIArguments(bundle); /* your new method */ } 

В вашем классе фрагментов

 public void setUIArguments(Bundle args) { getActivity().runOnUiThread(new Runnable() { public void run() { /* do your UI stuffs */ } } } 

Вы можете проверить, есть ли уже аргументы, и если да, просто добавьте / обновите их.

 private static void initFrag(Fragment frag, Bundle args) { if (frag.getArguments() == null) { frag.setArguments(args); } else { //Consider explicitly clearing arguments here frag.getArguments().putAll(args); } } 

При желании вы можете удалить существующие аргументы, если не можете смело предположить, что ранее существовавшие аргументы остаются в силе.

Эта глобальная переменная:

 private FragmentManager fragmentmanager; private FragmentTransaction fragmenttransaction; 

Этот код помещен в ваш элемент «Список фрагментов» onCreate ():

 fragmenttransaction = fragmentmanager.beginTransaction(); fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); fragmenttransaction.addToBackStack(null); fragmenttransaction.commit(); 

Это событие щелчка Drawerlistitem:

 @Override public void onListItemClick(ListView l, View v, int position, long id) { Bundle bundle = new Bundle(); fragmenttransaction = fragmentmanager.beginTransaction(); if(fragmentmanager.findFragmentById("test") != null) { fragmenttransaction.remove(fragmentmanager.findFragmentByTag("test")); } Detailfragment detailFragment = (Detailfragment)getFragmentManager().findFragmentById(detailFragmentID); bundle.putSerializable(BUNDLE_KEY, obj);// passing this object detailFragment.setArguments(bundle); fragmenttransaction.replace(detailFragmentID, detailFragment, "test"); fragmenttransaction.addToBackStack(null); fragmenttransaction.commit(); } 

Теперь расширяем код фрагмента как есть:

 Bundle b = getArguments(); b.getSerializable(BUNDLE_KEY); 

Общественный метод фрагмента диалога

  public void setBundle(final Bundle bundle) { final Bundle arguments = getArguments(); arguments.clear(); arguments.putAll(bundle); } 

Показать или обновить фрагмент диалога

  public void showMessageDialogue(final String tag, final Bundle bundle) { final Fragment fragment = mFragmentManager.findFragmentByTag(tag); if (fragment != null && fragment instanceof MessageDialogueFragment) { ((MessageDialogueFragment) fragment).setBundle(bundle); } else { final MessageDialogueFragment messageDialogueFragment = new MessageDialogueFragment(); messageDialogueFragment.setArguments(bundle); messageDialogueFragment.show(mFragmentManager, tag); } }