如何在LibGDX视图上方放置AdMob广告

3

我已经阅读了许多类似这样的教程:

https://github.com/libgdx/libgdx/wiki/Admob-in-libgdx

然而,我似乎无法理解一件事。它们都使用覆盖游戏视图的广告,而我更希望它位于上方,我的游戏视图被压缩。我该如何处理?我尝试使用线性布局,但也似乎不起作用。
这是我的onCreate()方法。
@Override public void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create the layout
        RelativeLayout layout = new RelativeLayout(this);

        // Do the stuff that initialize() would do for you
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

        // Create the libgdx View
        View gameView = initializeForView(new HelloWorld(), false);

        // Create and setup the AdMob view
        AdView adView = new AdView(this, AdSize.BANNER, "xxxxxxxx"); // Put in your secret key here
        adView.loadAd(new AdRequest());

        // Add the libgdx view
        layout.addView(gameView);

        // Add the AdMob view
        RelativeLayout.LayoutParams adParams = 
            new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
        adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        adParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

        layout.addView(adView, adParams);

        // Hook it all up
        setContentView(layout);
    }

在给定的链接中查看。它使用相对布局。Admob in LibGdx - Kumar Saurabh
@KumarSaurabh 这是我的问题,它重叠了!虽然我感谢你的帮助,但这并没有解决任何问题。 - Hamzah Malik
2个回答

3

此处所述,您可以为游戏视图设置一个边距,这很有效:

    RelativeLayout layout = new RelativeLayout(this);
    RelativeLayout.LayoutParams gameViewParams =
            new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
                    RelativeLayout.LayoutParams.WRAP_CONTENT);
    gameViewParams.bottomMargin = 150;

    View gameView = initializeForView(new MainGame(), cfg);
    layout.addView(gameView, gameViewParams);

    AdView adView = new AdView(this);
    adView.setAdUnitId("app-id");
    adView.setAdSize(AdSize.BANNER);

    RelativeLayout.LayoutParams adParams = 
        new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
                RelativeLayout.LayoutParams.WRAP_CONTENT);
    adParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);

    layout.addView(adView, adParams);

    AdRequest adRequest = new AdRequest.Builder().build();
    adView.loadAd(adRequest);

    setContentView(layout);

使用这种方法,广告视图在游戏视图下面,但是我猜你可以使用marginTop将你的游戏视图放在广告视图下面。

除了使用硬编码值来设置边距之外,还有其他解决方案吗?因为我遇到了类似的问题,但是横幅高度是可变的,因为我使用了SMART_BANNER配置。(顺便说一句,这个解决方案对我也没有用)。 - Genry
我没有尝试过,但我认为你可以使用updateViewLayout(View, LayoutParam)来使用计算出的底部边距值更新gameView的布局。 文档链接:http://developer.android.com/reference/android/view/ViewGroup.html#updateViewLayout%28android.view.View,%20android.view.ViewGroup.LayoutParams%29 - Thierry J.
1
我用不同的方法解决了这个问题,请看下面我的答案。 - Genry

2

以下是我处理同样问题的方法。首先设置AdView,然后将gameView放置在布局中AdView下方。

@Override public void onCreate (Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create the layout
    RelativeLayout layout = new RelativeLayout(this);

    // Do the stuff that initialize() would do for you
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);

    // Create the libgdx View
    View gameView = initializeForView(new HelloWorld(), false);

    // Create and setup the AdMob view
    AdView adView = new AdView(this, AdSize.BANNER, "xxxxxxxx"); // Put in your secret key here
    adView.loadAd(new AdRequest());

    // Add the AdMob view
    RelativeLayout.LayoutParams adParams = 
        new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
                RelativeLayout.LayoutParams.WRAP_CONTENT);
    adParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    adParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

    //define in resource xml: <item type="id" name="adViewId"/>
    adView.setId(R.id.adViewId); 

    layout.addView(adView, adParams);

    RelativeLayout.LayoutParams gameParams = 
        new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 
                RelativeLayout.LayoutParams.WRAP_CONTENT);
    gameParams.addRule(RelativeLayout.BELOW, adView.getId());

    // Add the libgdx view
    layout.addView(gameView, gameParams);

    // Hook it all up
    setContentView(layout);
}

这行代码 "initializeForView(new HelloWorld(), false);" 似乎已经发生了变化。 - JohnyTex
1
明白了。我忘记了这一行代码:"adView.setId(R.id.adViewId); "。太好了,谢谢! - JohnyTex
说这个不好。可能会干扰OpenGL...? - JohnyTex
可能吧,虽然我没有遇到任何问题。 - Genry
对我来说,它似乎也起作用了。尽管你的(真的更好的方法)的主要问题当然是在iOS上可能很难实现(我不太了解iOS)。 - JohnyTex
是的,这是一个平台相关的实现,你说得没错。 - Genry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接