Замена фрагментов в FragmentActivity останавливает мое приложение более чем на 5 секунд. - PullRequest
0 голосов
/ 09 октября 2018

У меня FragmentActivity называется StartupActivity.Это действие содержит 5 Fragments -> LoginFragment, LostPasswordFragment, RegistrationFragment, Login2Fragment, CityPickFragment.Я могу переключаться между фрагментами, используя ToolBar BackButton .Проблема в том, что замена определенного фрагмента с помощью suppportFragmentManager и простой транзакции отстает от приложения.Если я нажимаю BackButton , для переключения фрагмента требуется почти 5 секунд .Fragments имеет простой макет с 1 ImageView 2 EditTexts и кнопкой (+ Панель инструментов) .

Знаете ли вы, что может быть не так?

Вот пример кода, как фрагментпереключение работает.Когда я начну StartupActivity сразу после SplashScreen, он создаст все 5 фрагментов как переменные и установит по умолчанию Fragment в Контейнер FrameLayout .

Затем в каждом из 5 фрагментов будеткнопку назад на панели инструментов, и я установил onClickListener(), который вызывает метод в parentActivity на переключить фрагмент .

Мои фрагменты имеют теги , потому что я должен отключить onBackPressed () при первом фрагменте (Невозможно вернуться к SplashScreen из фрагмента по умолчанию).

//RegistrationFragment
fragmentBackButton.setOnClickListener {
            (activity as StartupActivity).switchToDefaultLoginFragment()
        }

//StartupActivity
fun switchToDefaultLoginFragment(){
        fragmentTransaction = supportFragmentManager.beginTransaction()
        fragmentTransaction.apply {
            replace(R.id.startup_fragment_container, defaultLoginFragment, "LOGIN_FRAGMENT")
            addToBackStack(null)
            commit()
        }
    }

1 Ответ

0 голосов
/ 09 октября 2018

Попробуйте выполнить код внутри Runnable.Вот так

Handler  mHandler = new Handler();

     Runnable mPendingRunnable = new Runnable() {
                @Override
                public void run() {
                    // update the main content by replacing fragments
                    Fragment fragment = getHomeFragment();
                    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,
                            android.R.anim.fade_out);
                    fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG);
                    fragmentTransaction.commitAllowingStateLoss();
                }
            };

            // If mPendingRunnable is not null, then add to the message queue
            if (mPendingRunnable != null) {
                mHandler.post(mPendingRunnable);
            }

Изменение вашего фрагмента в главном потоке, вызывающее выдачу

РЕДАКТИРОВАТЬ: В kotlin вы можете использовать вот так

private var   mDelayHandler : Handler? = Handler()
 mDelayHandler!!.post(mRunnable)


internal val mRunnable: Runnable = Runnable {
        Fragment fragment = getHomeFragment();
                        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,
                                android.R.anim.fade_out);
                        fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG);
                        fragmentTransaction.commitAllowingStateLoss();
                    }
                };
    }
...