Страницы

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

суббота, 11 апреля 2020 г.

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

#android #activity #android_fragment

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


Ответы

Ответ 1



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).

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

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