Страницы

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

четверг, 11 июля 2019 г.

Activity уничтожается при создании нового экземпляра

Проблема заключается в следующем: У меня есть класс MainActivity, класс FragmentWorkHelper для работы с фрагментами и класс VerticalPager для обработки вертикального скроллинга. В классе VerticalPager есть переменная mNextPage, которая получает номер следующей страницы во время прокрутки. Мне нужно, когда переменная mNextPager равняется 2, чтобы вызывалась функция в классе MainActivity или FragmentWorkHelper, которая удалит самый верхний фрагмент.
К сожалению, я не могу вызвать данную функцию следующим образом (данный код я вставляю на момент поднятия пальца):
if (mNextPage == 2){ MainActivity mainActivity = new MainActivity(); mainActivity.Del(); }
Так как активити уничтожается и я получаю следующую ошибку:
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.RemoveFrag(FragmentWorkHelper.java:31) at developers.com.polygon.MainActivity.Del(MainActivity.java:112) at developers.com.polygon.VerticalPager.onTouchEvent(VerticalPager.java:564) at android.view.View.dispatchTouchEvent(View.java:8968) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2698) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2410) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2709) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2425)...
MainActivity
FragmentWorkHelper helper = new FragmentWorkHelper(this);
public void Del(){ helper.RemoveFrag(mtcf); }
FragmentWorkHelper
private final FragmentActivity activity; FragmentManager fm;
public FragmentWorkHelper(FragmentActivity activity) { this.activity = activity; fm = activity.getSupportFragmentManager(); }
public void ReplaceFrag(Fragment f, int container){ FragmentTransaction ft = fm.beginTransaction(); ft.replace(container, f); ft.commit(); fm.executePendingTransactions(); }
public void RemoveFrag(Fragment f){ FragmentTransaction ft = fm.beginTransaction(); ft.remove(f); ft.commit(); fm.executePendingTransactions(); }
public void AddFrag(Fragment f, int container){ FragmentTransaction ft = fm.beginTransaction(); ft.add(container, f); ft.commit(); fm.executePendingTransactions(); }
Как можно обойти данную проблему?


Ответ

Совершенно непонятно зачем вы создаёте новый экземпляр активити в проблемном методе.
Вам надо просто получить ссылку на действующий экземпляр и в нём уже вызывать нужные вам методы. Если этот участок кода
if (mNextPage == 2){ MainActivity mainActivity = new MainActivity(); mainActivity.Del(); }
у вас в классе вашей активити, то вам надо преобразовать его так:
if (mNextPage == 2){ this.Del(); }
Если же он в каком-либо другом классе, то надо в него передать ссылку на вашу активити (также как вы это делаете в конструкторе класса FragmentWorkHelper) и преобразовать (если нужно) к классу MainActivity вот так:
if (mNextPage == 2){ MainActivity mainAct=(MainActivity) yoursReferenceToYoursActivity; mainAct.Del(); }
В случае когда этот кусок кода находится внутри ViewGroup, то вы можете получить Context методом getContext() и преобразовать его к MainActivity
if (mNextPage == 2){ MainActivity mainAct=(MainActivity) this.getContext(); mainAct.Del(); }

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

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