Страницы

Поиск по вопросам

пятница, 28 июня 2019 г.

Activity has been destroyed во время FragmentTransaction.commit()

Пишу небольшую программку для андроида. Мне нужно создать программно фрагменты. Для этого я написал отдельный класс с функциями FragmentWorkHelper.java:
public class FragmentWorkHelper extends FragmentActivity {
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction ft; public MainTopCompositeFragment mtcf = new MainTopCompositeFragment(); public MainCentralCompositeFragment mccf = new MainCentralCompositeFragment(); public MainBottomCompositeFragment mbcf = new MainBottomCompositeFragment();
public void ReplaceFrag(Fragment f, int container){ ft = fragmentManager.beginTransaction(); ft.replace(container, f); ft.commit(); }
public void RemoveFrag(Fragment f){ ft = fragmentManager.beginTransaction(); ft.remove(f); ft.commit(); }
public void AddFrag(Fragment f, int container){ ft = fragmentManager.beginTransaction(); ft.add(container, f); ft.commit(); }
public void CreateFrag(){ ft = fragmentManager.beginTransaction(); ft.add(R.id.main_top_fragment, mtcf); ft.add(R.id.main_central_fragment, mccf); ft.add(R.id.main_bottom_fragment, mbcf); ft.commit(); } }
Вызываю функции этого класса из различных мест программы, например в OnCreate() в MainActivity.java:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentWorkHelper fwh = new FragmentWorkHelper(); fwh.CreateFrag(); }
Но в итоге получаю вот что:
Process: developers.com.polygon, PID: 27767 java.lang.RuntimeException: Unable to start activity ComponentInfo{developers.com.polygon/developers.com.polygon.MainActivity}: java.lang.IllegalStateException: Activity has been destroyed at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) at android.app.ActivityThread.access$900(ActivityThread.java:177) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) Caused by: java.lang.IllegalStateException: Activity has been destroyed at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1399) at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:637) at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:616) at developers.com.polygon.FragmentWorkHelper.CreateFrag(FragmentWorkHelper.java:43) at developers.com.polygon.MainActivity.onCreate(MainActivity.java:51) at android.app.Activity.performCreate(Activity.java:6289) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
           В чем беда? Почему активити уничтожается? Я пытался засунуть функции в MainActivity, но выходит та же самая ошибка. Очень нужна помощь.


Ответ

getSupportFragmentManager возвращает менеджер для взаимодействия фрагментов с activity из которой он вызван. Соответственно ваш хелпер бесполезен т.к. он может управлять фрагментами только внутри своей activity, а не во всех activity вашего приложения. Если хелпер вам так нужен то сделайте так

public class FragmentWorkHelper{
private final FragmentActivity activity;
public FragmentWorkHelper(FragmentActivity activity) { this.activity = activity; }
public void replaceFrag(Fragment f, int container){ FragmentTransacion ft = activity.getSupportFragmentManager().beginTransaction(); //some work }
public void removeFrag(Fragment f){ FragmentTransacion ft = activity.getSupportFragmentManager().beginTransaction(); //some work }
public void addFrag(Fragment f, int container){ FragmentTransacion ft = activity.getSupportFragmentManager().beginTransaction(); //some work } }
И тогда в activity в методе onCreate() создавайте экземпляр этого хелпера FragmentWorkHelper helper = new FragmentWorkHelper(this).

Комментариев нет:

Отправить комментарий