У меня есть активность с 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)
Есть ли хорошее решение для этого? Заранее спасибо за любую помощь.