2014-09-13 3 views
0

Я пытаюсь описать ситуацию, у меня есть активность с listview1 и контейнером, где я сохраняю фрагмент. выглядит следующим образом enter image description hereclasscastexception после фиксации при попытке вызвать метод во фрагменте

Желтый контейнер с фрагментом. В начале, когда приложение запускается, в желтом контейнере я сохраняю фрагмент с другим, например listView2. Когда я нажимаю на listView1, на желтой части должен появиться другой фрагмент, который показывает изображение. И когда я хочу закрыть эту картинку, listview2 должен появиться на желтой стороне, и все будет отлично работать до этого кода.

здесь я делаю заменить действие в желтом контейнере и после этого я пытаюсь воссоздать listview2 в новом заменен фрагментом

public void backToList() 
    { 
     FragmentTransaction fragmentTransaction = fragManager.beginTransaction(); 

     Fragment fragment =null; 

     fragment = new Presence_Fragment(); 


     fragmentTransaction.replace(R.id.main_screen_fragment_container, fragment); 
     fragmentTransaction.commit(); 
     createProperlyListViewInPresenceOrAktywnosciFragment(); 
    } 

и вот метод, который вызывает CreateListViewMethod() из фрагмента

public void createProperlyListViewInPresenceOrAktywnosciFragment() 
    { 

      Presence_Fragment presence_Fragment = (Presence_Fragment) fragManager.findFragmentById(R.id.main_screen_fragment_container); 
      presence_Fragment.CreateListView(); 


    } 

LogCat:

09-13 00:52:35.653: E/AndroidRuntime(2980): FATAL EXCEPTION: main 
09-13 00:52:35.653: E/AndroidRuntime(2980): Process: com.example.kinder, PID: 2980 
09-13 00:52:35.653: E/AndroidRuntime(2980): java.lang.ClassCastException: com.example.kinder.ChildBioFragment cannot be cast to com.example.kinder.Presence_Fragment 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at com.example.kinder.MainScreen.createProperlyListViewInPresenceOrAktywnosciFragment(MainScreen.java:175) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at com.example.kinder.MainScreen.backToList(MainScreen.java:216) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at com.example.kinder.ChildBioFragment$1.onClick(ChildBioFragment.java:47) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at android.view.View.performClick(View.java:4445) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at android.view.View$PerformClick.run(View.java:18446) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at android.os.Handler.handleCallback(Handler.java:733) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at android.os.Handler.dispatchMessage(Handler.java:95) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at android.os.Looper.loop(Looper.java:136) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at android.app.ActivityThread.main(ActivityThread.java:5139) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at java.lang.reflect.Method.invoke(Method.java:515) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
09-13 00:52:35.653: E/AndroidRuntime(2980):  at dalvik.system.NativeStart.main(Native Method) 

Logcat ищет меня, как в контейнере. Я все еще храню старый фрагмент, но это невозможно. Я уже заменяю ChildBioFragment на Presence_Fragment и делаю commit. И я хочу вызвать метод из Presence_fragment, так что не так с этим кодом

ответ

0

Вы делаете предположение здесь: commit() сразу же выполняет. Однако это не так. Он выполняет асинхронно (по потоку пользовательского интерфейса) в соответствии с документацией:

Конец не происходит немедленно; это будет запланировано, поскольку работа над основным потоком будет выполнена в следующий раз, когда поток будет готов.

Один из способов выполнить коммит синхронно, чтобы назвать следующее сразу после него:

fragmentManager.executePendingTransactions(); 

См the docs подробности:

Если вы хотите немедленно запустить любую такую ​​Pending операции [операции фрагмента], вы можете вызвать эту функцию (только из основного потока), чтобы сделать это.

В качестве альтернативы просто сохраните ссылку на фрагмент присутствия, который вы создаете (вместо получения его от менеджера). Просто помните, что commit() работает асинхронно, поэтому не пытайтесь коснуться любого его вида и т. Д. Сразу после фиксации.

+0

Да, это источник моей проблемы. Я надел логарифм, когда вызывается метод onDetach в ChildBioFragment, и когда createProperlyListViewInPresenceOrAktywnosciFragment и, во-первых, был вызван метод createProperly .., а затем onDetach, моим решением было воссоздать список в Presence_Fragment, и это работает – MyWay

Смежные вопросы