Проблема заключается в следующем: У меня есть класс 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();
}
Комментариев нет:
Отправить комментарий