zeroWiNNeR
@zeroWiNNeR

Почему не работает вызов метода из другого класса?

В классе активити содержится метод:

.....
public void openListView(){

        FragmentManager manager = getSupportFragmentManager();
        androidx.fragment.app.FragmentTransaction transaction = manager.beginTransaction();

        ListViewFragment listViewFragment = new ListViewFragment();

        transaction.replace(R.id.fragmentFrameLayout, listViewFragment);

        transaction.commit();
    }

.....

При вызове этого метода из активити, всё ок, фрагмент появляется.

Также есть класс адаптера для recyclerview. В этом классе, при нажатии по элементу recyclerview должен вызываться вышесказанный метод. Вызов метода в адаптере:

ProductsActivity productsActivity = new ProductsActivity();
productsActivity.openListView();


При нажатии приложение крэшится, при дебаге определил, что вылет происходит при вызове transaction.commit()

Ошибка:
9913-9913/ru.retail.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: ru.retail.app, PID: 9913
    java.lang.IllegalStateException: Activity has been destroyed
        at androidx.fragment.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2114)
        at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:683)
        at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:637)
        at ru.retail.app.Activity.ProductsActivity.openListView(ProductsActivity.java:203)
        at ru.retail.app.adapter.ProductsActivity_CategoriesRecyclerViewAdapter.openCategory(ProductsActivity_CategoriesRecyclerViewAdapter.java:121)
        at ru.retail.app.adapter.ProductsActivity_CategoriesRecyclerViewAdapter$categoriesButtonListener.onClick(ProductsActivity_CategoriesRecyclerViewAdapter.java:198)
        at android.view.View.performClick(View.java:5675)
        at android.view.View$PerformClick.run(View.java:22641)
        at android.os.Handler.handleCallback(Handler.java:836)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6251)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
  • Вопрос задан
  • 129 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Так делать нельзя, и дело не только в классах и методах. Активити в андроиде это один из фундаментальных компонетов. Их всегда создаёт ОС, ты можешь только делать что-то в коллбечных методах жизненного цикла.
Также, во фрагменте ты можешь получить экземпляр Активити, к которой этот фрагмент добавлен(getActivity()). Правда, сделать это можно не всегда, а только между вызовами onAttach/onDetach.

Прочитав инфу по ссылкам ты должен что-то понять. Не 100%, но какое-то понимание возникнуть должно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
iLLuzor
@iLLuzor
Java, Kotlin, Android Developer
Адовая жесть.
Сделать нужно следующее:
  1. Взять учебник
  2. Прочитать про классы и объекты
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ЭЛКОМ+ Санкт-Петербург
от 80 000 до 110 000 руб.
АКМЭ сервис Санкт-Петербург
от 80 000 до 110 000 руб.
iGooods.ru Санкт-Петербург
от 150 000 руб.