Дождитесь окончания анимации FragmentTransaction - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть активность с EditText и Button. Как только в EditText введен номер и нажата кнопка, фрагмент (охватывающий весь экран) отображается в течение двух секунд, а затем удаляется. Обе транзакции вызвали showCustomAnimations(). В коде после вызова commit() для операции удаления FragmentTransaction программная клавиатура отображается через showSoftInput().

. Проблема, с которой я сталкиваюсь: во время выполнения анимации удаления фрагмент уже выскользнул из экрана. на 80% появляется всплывающая клавиша. Теперь, если вы быстро введете число и нажмете кнопку, приложение завершит работу, потому что предыдущая анимация все еще работала.

Я уже видел несколько ответов, но я обнаружил, что их недостаточно или они не работают. Любой вызов для commitNow() или executePendingTransitions() не помогает, поскольку транзакция зафиксирована, проблема заключается в том, что анимация все еще выполняется после этого. Метод getVisibleUserHint(), чтобы проверить, видна ли активность, устарел.

Код:

TrueFragment trueFragment = new TrueFragment();

fabNext.setOnClickListener(new View.OnClickListener() {  //fabNext is my button
        @Override
        public void onClick(View v) {

            fabNext.setEnabled(false);  //blocking button to avoid clicking (... further code for this...)
            inputManager.hideSoftInputFromWindow(constraintLayoutCalculating.getWindowToken(), 0);  //hide Keyboard

            final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  //FragmentTransaction to show the Fragment
            transaction.setCustomAnimations(R.animator.slide_in, 0);
            transaction.add(R.id.constraintLayoutCalculating, trueFragment);
            transaction.commitAllowingStateLoss();
            getSupportFragmentManager().executePendingTransactions();

            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {

                    FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();  //FragmentTransaction to remove the Fragment
                    transaction2.setCustomAnimations(0, R.animator.slide_out);
                    transaction2.remove(trueFragment);
                    transaction2.commitAllowingStateLoss();
                    editText.setText(null);  //reset EditText
                    editText.requestFocus();
                    textInputLayout.setError(null);
                    inputManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);  //show Keyboard
                    fabNext.setEnabled(true);  //reenable button at the end - Problem: Button made clickable again, even if the remove FragmentTransaction animation hasn't finished

               }
         }, 1000);
}

Это кража sh, которую я получаю. Поиск в StackOverflow показал мне, что это связано с запуском FragmentTransaction, пока еще не завершена другая.

 --------- beginning of crash
2020-02-17 10:27:29.787 23467-23467/my.top.secretpreciousname E/AndroidRuntime: FATAL EXCEPTION: main
    my.top.secretpreciousname, PID: 23467
    java.lang.IllegalStateException: Restarter must be created only during owner's initialization stage
        at androidx.savedstate.SavedStateRegistryController.performRestore(SavedStateRegistryController.java:58)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2585)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:838)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl.executePendingTransactions(FragmentManagerImpl.java:183)
        at my.top.secretpreciousname.CalculatingActivity$1.onClick(CalculatingActivity.java:254)
        at android.view.View.performClick(View.java:7339)
        at my.top.secretpreciousname.CalculatingActivity$2.onEditorAction(CalculatingActivity.java:320)
        at android.widget.TextView.doKeyDown(TextView.java:8617)
        at android.widget.TextView.onKeyDown(TextView.java:8486)
        at android.view.KeyEvent.dispatch(KeyEvent.java:3359)
        at android.view.View.dispatchKeyEvent(View.java:13312)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1912)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1912)

Есть ли хорошее решение для этого? Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 18 февраля 2020

Получается, что мне нужно добавить строку

transaction2.addToBackStack(null);

к анимированной транзакции FragmentTransaction, чтобы добиться того, что она не обработает sh, когда новая транзакция запускается до того, как предыдущая закончила свою. анимация. До сих пор не уверен, что это можно считать допустимым решением, так как на самом деле я не хочу функциональности backstack с этими фрагментами, поэтому мне приходится временно блокировать кнопку back или flu sh Backstack после каждой транзакции.

...