Android: фрагмент и задний стек - PullRequest
1 голос
/ 26 июля 2011

В моем приложении у меня есть одно действие, которое состоит из накладывающейся боковой панели (меню навигации) и LinearLayout, который является моим основным макетом. Я делаю транзакции на моем макете и заменяю фрагменты внутри. Я только позволяю пользователю перемещаться вперед, поэтому я вообще не использую backstack. Вместо этого я использую Hashmap (псевдо-кеш), чтобы сохранить экземпляры фрагментов в памяти, когда пользователь перемещается по меню вперед. Единственная проблема с этим подходом состоит в том, что я продолжаю получать сбой, когда пытаюсь заменить фрагмент, который в настоящее время находится в основном макете, фрагментом из кэша (я запустил его через отладчик, и он говорит, что метод FragmentTransaction.replace () проверить бэкстек (??)). Я не совсем уверен, в чем проблема.

07-25 22:03:47.690: ERROR/AndroidRuntime(3141): FATAL EXCEPTION: main
07-25 22:03:47.690: ERROR/AndroidRuntime(3141): java.lang.IllegalStateException: Fragment already added: GuideFragment{409f2fd8 id=0x7f06008c}
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.app.BackStackRecord.doAddOp(BackStackRecord.java:322)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.app.BackStackRecord.replace(BackStackRecord.java:360)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.app.BackStackRecord.replace(BackStackRecord.java:352)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at StartActivity.changeContent(StartActivity.java:194)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at StartActivity$5.onClick(StartActivity.java:165)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.view.View.performClick(View.java:3117)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.view.View$PerformClick.run(View.java:11935)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.os.Handler.handleCallback(Handler.java:587)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.os.Looper.loop(Looper.java:132)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at android.app.ActivityThread.main(ActivityThread.java:4025)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at java.lang.reflect.Method.invokeNative(Native Method)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at java.lang.reflect.Method.invoke(Method.java:491)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
07-25 22:03:47.690: ERROR/AndroidRuntime(3141):     at dalvik.system.NativeStart.main(Native Method)

Ответы [ 3 ]

1 голос
/ 01 октября 2012

Кажется, ваш фрагмент не может быть заменен в представлении.Во время надувания может отсутствовать третий параметр LayoutInflater.inflate ().

Проверьте, он должен выглядеть как

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.session_frag, container, false);  
            return view;
        }
1 голос
/ 09 августа 2011

У меня была похожая проблема.Как я уже упоминал в своем комментарии, мое приложение работает нормально на физических устройствах, но вылетает на эмуляторе.Я не уверен, почему он выдает эту ошибку Fragment already added, но я нашел обходной путь.

Прежде чем пытаться заменить фрагмент, я сначала удаляю его (что кажется нелогичным, но мне кажется, что это работает)используя блок try-catch.

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
try
{
    fragmentTransaction.remove(guideFragment);
}
catch(IllegalStateException e)
{
    e.printStackTrace();
}
fragmentTransaction.replace(R.id.container, guideFragment, GUIDE_FRAGMENT_TAG);
fragmentTransaction.commit();

Кажется, что метод replace () имеет некоторые странные поведения, которые не всегда работают так, как вы ожидаете. Другие также должны были использовать обходные пути.

0 голосов
/ 12 октября 2011

Проверьте, работает ли добавленный фрагмент перед заменой.

...