当前位置: 首页 > 知识库问答 >
问题:

使用ViewPager时出现间隙广告问题

蒋高杰
2023-03-14

我想在我的viewPager中添加间隙广告,但一旦间隙广告关闭(或打开时),我就遇到了容器“消失”(或被销毁)的问题。一旦滑动,就会自动调用@Override方法“public void destructionitem(ViewGroup container,int position,Object Object)”,并调用间隙ad,但是,视图不会像未调用间隙ad时那样再次膨胀。

我的类扩展了PagerAdapter,我的一般设置如下:

@Override
public boolean isViewFromObject(View view, Object object) {
    // TODO Auto-generated method stub
    return view == ((RelativeLayout) object);
}

@Override
public Object instantiateItem(final ViewGroup container, final int position) {

    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    //instantiate TextViews, Buttons, ect (code not posted)

    ((ViewPager) container)
            .setOnPageChangeListener(new OnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    // the maximum position value is 130
                    // I want to display an interstitial ad every 7th position

                    if (position % 7 == 0) {
                        displayInterstitial();
                    }

                }

                @Override
                public void onPageScrollStateChanged(int state) {
                    // TODO Auto-generated method stub
                }

                @Override
                public void onPageScrolled(int position,
                        float positionOffset, int positionOffsetPixels) {
                    // TODO Auto-generated method stub
                }
            });



    if (interstitialLoad == false && isConnection == false) {
        if (NetworkUtils.isConnected(context) == true
                && NetworkUtils.isNetworkActive(context) == true) {
            isConnection = true;

            // create an ad
            interstitialAd = new InterstitialAd(context);
            interstitialAd.setAdUnitId(AD_UNIT_ID_INT);

            // request interstitial ads
            AdRequest adRequestInterstitial = new AdRequest.Builder()
                    .build();

            // begin loading interstitial
            interstitialAd.loadAd(adRequestInterstitial);
        }
    }

    if (isConnection = true) {
        // Set the AdListener.
        interstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdClosed() {
                // do nothing
            }

            @Override
            public void onAdLoaded() {
                if (interstitialLoad == false) {
                    interstitialLoad = true;
                }
            }

            @Override
            public void onAdFailedToLoad(int errorCode) {
                String message = String.format("onAdFailedToLoad (%s)",
                        getErrorReason(errorCode));
                Log.e(TAG, message);
            }
        });
    }

    // add fragments to container (ViewPager)
    ((ViewPager) container).addView(itemView);
    return itemView;

}

/** Gets a string error reason from an error code. */
private String getErrorReason(int errorCode) {
    String errorReason = "";
    switch (errorCode) {
    case AdRequest.ERROR_CODE_INTERNAL_ERROR:
        errorReason = "Internal error";
        break;
    case AdRequest.ERROR_CODE_INVALID_REQUEST:
        errorReason = "Invalid request";
        break;
    case AdRequest.ERROR_CODE_NETWORK_ERROR:
        errorReason = "Network Error";
        break;
    case AdRequest.ERROR_CODE_NO_FILL:
        errorReason = "No fill";
        break;
    }
    return errorReason;
}

// invoke displayInterstitial() when ready to display an interstitial
private void displayInterstitial() {
    if (interstitialLoad == true && interstitialAd.isLoaded()) {
        Log.e(TAG, "displayInterstitial()");
        interstitialAd.show();
    }
}

@Override
public void restoreState(Parcelable state, ClassLoader loader) {
    // TODO Auto-generated method stub
    super.restoreState(state, loader);
}

@Override
public Parcelable saveState() {
    // TODO Auto-generated method stub
    return super.saveState();
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((RelativeLayout) object);

}

这是事情发生的顺序(假设我们在位置6(pg 6)):

1) 当我滑动到第7页时,首先会自动调用@Override destroyItem(ViewGroup container,int position,Object Object)方法。

2) 然后自动调用@Override onPageSelected(int position)方法,并显式调用displayInterstitual()方法。

3)从displayInterstiular()方法内部,显示间隙广告。此时,自动调用@Overder方法saveState()。

4) 作为“最终用户”,我单击“X”或按设备后退按钮关闭显示的广告。

5) 整个视图(或/和容器)将消失。我所期望的行为是调用@Override方法restoreState(),然后我仍然可以看到我的容器及其视图。

我怎样才能让一切都从间隙被调用和关闭之前停止的地方恢复过来?有人对如何解决这个问题有任何想法吗?提前感谢!

共有2个答案

满伟彦
2023-03-14

谢谢你的回答,丹和我想出了一个解决办法。我的问题是,在第一个广告显示并销毁后,我需要重新加载一个新广告。因此,我基本上在AdListener中重新实例化,我的冲突得到了解决。每7次滑动,无限显示广告单位。干杯

if (isConnection == true) {
            // Set the AdListener.
            interstitialAd.setAdListener(new AdListener() {
                @Override
                public void onAdClosed() {
                    // do nothing
                    Log.i(TAG, "onAdClosed()");     
                    LayoutInflater inflater = (LayoutInflater) context
                            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                    int layoutColorId = ElementStructure.arrayLayoutColor.get(position);

                    if (layoutColorId == 1) {
                        itemView = inflater.inflate(R.layout.frame_learn_a, container,
                                false);
                    } else if (layoutColorId == 2) {
                        itemView = inflater.inflate(R.layout.frame_learn_b, container,
                                false);
                    } else if (layoutColorId == 3) {
                        itemView = inflater.inflate(R.layout.frame_learn_c, container,
                                false);
                    } else if (layoutColorId == 4) {
                        itemView = inflater.inflate(R.layout.frame_learn_d, container,
                                false);
                    }

                    // reload interstitial ad
                    if (NetworkUtils.isConnected(context) == true
                            && NetworkUtils.isNetworkActive(context) == true) {
                        Log.i(TAG, "Internet connection detected :: reload interstitial");
                        if (isConnection == false) {
                            isConnection = !isConnection;
                        }

                        // create an ad
                        interstitialAd = new InterstitialAd(context);
                        interstitialAd.setAdUnitId(AD_UNIT_ID_INT);

                        // request interstitial ads
                        AdRequest adRequestInterstitial = new AdRequest.Builder()
                                .build();

                        // begin loading interstitial
                        interstitialAd.loadAd(adRequestInterstitial);
                    }
                }

                @Override
                public void onAdLoaded() {
                    if (interstitialLoad == false) {
                        Log.e(TAG, "onAdLoaded (interstitial)");
                        interstitialLoad = !interstitialLoad;
                    }
                }

                @Override
                public void onAdFailedToLoad(int errorCode) {
                    String message = String.format("onAdFailedToLoad (%s)",
                            getErrorReason(errorCode));
                    Log.e(TAG, message);
                }
            });
        }
仲孙小云
2023-03-14

可能与你的问题无关但是

if (isConnection = true) {

应该是:

if (isConnection == true) {
 类似资料:
  • 我有一个服务,它将在特定的时间点显示一个活动,在该活动之后,每13次我都显示一个admob插屏广告。当显示插屏广告时,我的应用程序的RAM使用量增加了20MB,之后它不会被垃圾收集。在接下来的13次显示另一个插屏广告时,服务内存没有增加。 我显示广告的代码: 我在以下堆栈溢出问题中尝试了一些解决方案,但没有任何解决方案对我有用。 Android Admob间内存泄漏 Android AdMob导致

  • 嗨,伙计们,我的广告插页有问题。我在主活动中有一个横幅,但在另一个活动中,我想显示一个插页广告。横幅可以。。。我能看到这个!但间隙并没有显示。。。这是我的代码: } 我的UnitID是正确的:有一个logcat。 我在4.4.2中使用了模拟器,但我在物理设备上进行了尝试,但没有在中间位置使用广告,但在主活动中使用了小横幅! 我有GooglePlayService库...我的应用程序使用google

  • 我想在Google Play的“专为家庭设计”类别中为儿童制作应用程序。据此:https://support.google.com/googleplay/android-developer/answer/6184502有两条规则: 不得使用广告墙 插播广告不得在应用程序启动后立即显示 请您解释一下如何使间质广告不全屏(不是广告墙)? 广告墙和插页广告有什么区别? 我曾经用过这个填隙词:https:

  • 我想在一定的时间间隔后,在主要活动上添加一个间隙广告。我搜索,似乎没有参考代码这样做。感谢你的帮助我该怎么做?任何示例代码都将是有用的。多谢了。

  • 我正在遵循本教程 到目前为止,当我点击按钮时,它就可以工作了。然而,我似乎无法让它在viewDidLoad上显示中间广告。 这就是我所拥有的: 控制台不断向我显示: 2016-02-04 22:27:51.855 GoogleAdamObjutorial[3394:56415]要获取此设备上的测试广告,请致电:request。testDevices=@[kGADSimulatorID]; 单击按钮

  • 我成功地在我的应用程序中实现了AdMob中间广告,但唯一的问题是它们不可点击。 下面是我的AdMob.java类: 和MainPageActivity.java文件: 我不知道当用户升级并按下播放按钮(这将引导他进入下一个级别)时,该如何显示间隙广告。当他按下home键时,间隙广告就会出现,这会把他带到MainActivity屏幕上。 有人能帮我把广告点击一下吗?另外,有什么建议,如何添加的间隙广