【问题标题】:Admob banner wrong positionAdmob 横幅位置错误
【发布时间】:2019-12-17 11:57:44
【问题描述】:

我有一个用 JAVA 编写的 android 游戏,由于某种未知原因,Admob 横幅在我们的一小部分玩家设备上显示在错误的位置,我已经在 30 多个设备上对其进行了测试,但无法重现它,一些玩家不过给我们发了证明。

根据设计,我们的横幅应始终显示在屏幕的右上角,但有时它会显示在左上角,任何想法都将不胜感激。

这就是我初始化它的方式(我以编程方式做所有事情,没有 xml

    @Override
    protected void onSetContentView()
    {
        final RelativeLayout relativeLayout = new RelativeLayout(this);

        final FrameLayout.LayoutParams relativeLayoutLayoutParams = new FrameLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);

        this.mRenderSurfaceView = new RenderSurfaceView(this);
        this.mRenderSurfaceView.setRenderer(this.mEngine, this);

        final android.widget.RelativeLayout.LayoutParams surfaceViewLayoutParams = new RelativeLayout.LayoutParams(BaseGameActivity.createSurfaceViewLayoutParams());
        surfaceViewLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

        relativeLayout.addView(this.mRenderSurfaceView, surfaceViewLayoutParams);

        FrameLayout frameLayout = new FrameLayout(this);

        FrameLayout.LayoutParams fparams=new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);

        adView = new AdView(this);

        final FrameLayout.LayoutParams adViewLayoutParams = new FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.WRAP_CONTENT,
                FrameLayout.LayoutParams.WRAP_CONTENT,
                Gravity.END | Gravity.TOP);

        adView = new AdView(this);
        adView.setAdSize(com.google.android.gms.ads.AdSize.BANNER);
        adView.setAdUnitId("....");
        adView.setEnabled(false);
        adView.refreshDrawableState();
        adView.setVisibility(AdView.GONE);
        AdRequest adRequest = new AdRequest.Builder().build();
        adView.loadAd(adRequest);
        adView.refreshDrawableState();

        frameLayout.addView(adView,adViewLayoutParams);

        relativeLayout.addView(frameLayout,fparams);

        this.setContentView(relativeLayout, relativeLayoutLayoutParams);
    }

显示/隐藏方法:

public void hideBanner()
    {
        if (adDisplayed)
        {
            this.runOnUiThread(new Runnable()
            {
                @Override
                public void run() {
                    adView.setEnabled(false);
                    adView.setVisibility(View.INVISIBLE);
                    adDisplayed = false;
                }
            });
        }
    }

    public void showBanner()
    {
        if (!ResourcesManager.getInstance().isNoAdverts())
        {
            if (!adDisplayed)
            {
                this.runOnUiThread(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        AdRequest adRequest = new AdRequest.Builder().build();
                        adView.loadAd(adRequest);

                        adView.setAdListener(new com.google.android.gms.ads.AdListener()
                        {
                            @Override
                            public void onAdLoaded()
                            {
                                adView.setVisibility(View.GONE);
                                adView.setEnabled(true);
                                adView.setVisibility(AdView.VISIBLE);
                            }
                        });

                        adDisplayed = true;
                    }
                });
            }
        }
    }

这是我的项目设置:

    compileSdkVersion 28
    minSdkVersion 16
    targetSdkVersion 28

此问题由 SDK 玩家报告:23

【问题讨论】:

  • 您知道遇到问题的用户使用的是哪个 API 版本吗?您的最低 SDK 版本是多少? Gravity.END 似乎有问题,但没有足够的信息让我确定。
  • 嗨,Leo,我已在帖子底部添加了这些详细信息,谢谢!
  • 用户是否在使用从右到左的语言(如希伯来语)时遇到问题?
  • @BenP - 是的,它是由来自以色列的用户报告的。谢谢。

标签: java android android-layout admob banner


【解决方案1】:

鉴于以色列的用户报告了该问题,我怀疑该用户将其设备的语言设置为从右到左语言,例如希伯来语。

由于您使用的是Gravity.END,因此在这种情况下,这会将元素放置在设备的左侧(毕竟, 是该用户的“终点”)。如果您希望元素始终位于右侧,无论用户选择的语言的正常布局方向如何,请改为使用 Gravity.RIGHT 构建您的 LayoutParams

或者,您可以为您的应用程序禁用right-to-left support。检查AndroidManifest.xml 中的<application> 标签并删除此属性:

android:supportsRtl="true"

【讨论】:

  • 嗨,Ben,这实际上是有道理的(我曾经有重力 RIGHT,最近在我切换网络时将其更新为 END)我将更改它,将更新的 apk 上传到 Play 商店,然后询问 admob团队审查我的违规行为,希望我会尽快将此答案标记为正确,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多