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