我有一个包含EditText和Button的活动。只要在EditText中输入一个数字并单击按钮,就会显示一个片段(覆盖整个屏幕)两秒钟,然后将其删除。两个事务都调用了showCustomAnimations()。在代码中,在remove FragmentTransaction上调用commit()之后,通过showSoftInput()显示了软键盘。
我面临的问题是:当remove动画正在运行时,片段已经滑出屏幕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);
}这就是我得到的崩溃。在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)有没有很好的解决方案?提前感谢您的帮助。
发布于 2020-02-18 20:10:53
结果是,我必须添加这一行
transaction2.addToBackStack(null);添加到动画FragmentTransaction,以实现在前一个事务完成其动画之前触发新事务时,它不会崩溃。我仍然不确定这是否可以被认为是一个有效的解决方案,因为实际上我不想使用这些片段的backstack功能,所以我不得不在每次事务后暂时阻止back按钮或刷新Backstack。
https://stackoverflow.com/questions/60261888
复制相似问题