首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待FragmentTransaction动画完成

等待FragmentTransaction动画完成
EN

Stack Overflow用户
提问于 2020-02-17 19:55:07
回答 1查看 477关注 0票数 0

我有一个包含EditTextButton的活动。只要在EditText中输入一个数字并单击按钮,就会显示一个片段(覆盖整个屏幕)两秒钟,然后将其删除。两个事务都调用了showCustomAnimations()。在代码中,在remove FragmentTransaction上调用commit()之后,通过showSoftInput()显示了软键盘。

我面临的问题是:当remove动画正在运行时,片段已经滑出屏幕80%,软键盘弹出。现在,如果你快速输入一个数字并按下按钮,应用程序就会崩溃,因为之前的动画仍在运行。

我已经看到了几个答案,但我发现它们不够充分或不起作用。任何对commitNow()executePendingTransitions()的调用都无济于事,因为事务已提交,问题是动画在提交后仍在运行。用于检查活动是否可见的方法getVisibleUserHint()已弃用。

代码:

代码语言:javascript
复制
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有关,而另一个还没有完成。

代码语言:javascript
复制
 --------- 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)

有没有很好的解决方案?提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-02-18 20:10:53

结果是,我必须添加这一行

代码语言:javascript
复制
transaction2.addToBackStack(null);

添加到动画FragmentTransaction,以实现在前一个事务完成其动画之前触发新事务时,它不会崩溃。我仍然不确定这是否可以被认为是一个有效的解决方案,因为实际上我不想使用这些片段的backstack功能,所以我不得不在每次事务后暂时阻止back按钮或刷新Backstack。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60261888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档