Admob 横幅位置错误
Admob banner wrong position
我有一个用 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);
}
Show/hide 方法:
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
鉴于以色列的一位用户报告了该问题,我怀疑该用户将其设备的语言设置为从右到左 的语言,例如希伯来语。
由于您使用的是 Gravity.END
,在这种情况下,这会将元素放置在设备的左侧(毕竟 是 "end" 这个用户)。如果您希望元素始终位于右侧,而不管用户选择的语言的正常布局方向如何,请使用 Gravity.RIGHT
构建您的 LayoutParams
。
或者,您可以为您的应用程序禁用 right-to-left support。检查 AndroidManifest.xml
中的 <application>
标签并删除此属性:
android:supportsRtl="true"
我有一个用 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);
}
Show/hide 方法:
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
鉴于以色列的一位用户报告了该问题,我怀疑该用户将其设备的语言设置为从右到左 的语言,例如希伯来语。
由于您使用的是 Gravity.END
,在这种情况下,这会将元素放置在设备的左侧(毕竟 是 "end" 这个用户)。如果您希望元素始终位于右侧,而不管用户选择的语言的正常布局方向如何,请使用 Gravity.RIGHT
构建您的 LayoutParams
。
或者,您可以为您的应用程序禁用 right-to-left support。检查 AndroidManifest.xml
中的 <application>
标签并删除此属性:
android:supportsRtl="true"