在 onAdClosed() 方法中调用片段

Call a fragment inside onAdClosed() method

我有一个奇怪的问题。当向用户显示插页式广告并且用户将其关闭时,我在方法 onAdClosed() 中调用下一个片段。下面是我为此目的编写的代码

myInterstitialAd.setAdListener(new AdListener() {

                            @Override
                            public void onAdOpened() {
                                // Code to be executed when the ad is displayed.

                            }

                            @Override
                            public void onAdClosed() {

                                FragmentManager fragmentManager = getActivity().getSupportFragmentManager();

                                FragmentTransaction transaction = fragmentManager.beginTransaction();
                                transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
                                TestFragment newCustomFragment = new TestFragment();
                                transaction.replace(((ViewGroup) view.getParent()).getId(), newCustomFragment);
                                transaction.commit();

                            }
                        });

它在新 API 上运行良好,但我在 API 19 上遇到问题。问题是广告关闭但下一个片段没有调用。之后,我将我的代码包装在一个处理程序中,这对我有用,即

@Override
                            public void onAdClosed() {

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

                                        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();

                                        FragmentTransaction transaction = fragmentManager.beginTransaction();
                                        transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
                                        TestFragment newCustomFragment = new TestFragment();
                                        transaction.replace(((ViewGroup) view.getParent()).getId(), newCustomFragment);
                                        transaction.commit();

                                    }
                                }, 300);

                            }
                        });

问题已解决,但我有时会遇到非法状态异常。我应该怎么做才能防止这种情况发生?

IllegalStateExceptionsonSaveInstanceState 调用后 replace 片段时抛出。你有两种方法来解决这个问题

  1. 您可以使用 commitAllowingStateLoss 代替 commit

  2. 创建你的 Handler 全局变量并调用 Handler.removeCallbacksAndMessages(null); insde onPause 当前片段以删除执行 replace