下面的代码将AdMob横幅定位在视图的底部。但问题是我使用了LinearLayout
并将横幅向上移动了75像素。这很糟糕,因为横幅高度通常是50px,但在向上移动50px之后,它只显示了横幅的一部分。另一个问题是横幅高度不固定。
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenWidth = displaymetrics.widthPixels;
int screenHeight = displaymetrics.heightPixels;
LinearLayout.LayoutParams adParams = new LinearLayout.LayoutParams(screenWidth, 2 * screenHeight - 75);
// Create an ad.
adView = new AdView(this);
adView.setAdSize(AdSize.BANNER);
adView.setAdUnitId(AD_UNIT_ID);
// Create an ad request. Check logcat output for the hashed device ID to
// get test ads on a physical device.
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("INSERT_YOUR_HASHED_DEVICE_ID_HERE")
.build();
// Start loading the ad in the background.
adView.loadAd(adRequest);
// Adding full screen container
addContentView(adView, adParams);
我已经尝试使用RelativeLayout
代替LinearLayout
,像这样:
RelativeLayout.LayoutParams lay = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
lay.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
..................
......................
addContentView(adView, lay);
但是这显示了屏幕顶部的横幅。我怎样才能把它弄到底呢?
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build();
RelativeLayout relativeLayout = new RelativeLayout(this);
mFrameLayout.addView(relativeLayout);
RelativeLayout.LayoutParams adViewParams = new RelativeLayout.LayoutParams(
AdView.LayoutParams.WRAP_CONTENT,
AdView.LayoutParams.WRAP_CONTENT);
// align bottom
adViewParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
// align center
adViewParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
relativeLayout.addView(adView, adViewParams);
adView.loadAd(adRequest);
adView.setBackgroundColor(Color.BLACK);
adView.setBackgroundColor(0);
在我的例子中,mFrameLayout
在cocos2d-x Cocos2dxActivity
类中定义,定义如下:
// FrameLayout
ViewGroup.LayoutParams framelayout_params =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
mFrameLayout = new FrameLayout(this);
mFrameLayout.setLayoutParams(framelayout_params);
如果你想把AdView定位在屏幕的底部,那么一个简单的方法就是把你想要在LinearLayout中显示的内容包装起来,并将其标记为android:Layout_weight="1"
。这将确保它占用除了AdView占用的空间之外的所有空间。
<!-- In your layout xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!-- NB make layout_weight=1 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
>
.. your content goes here.
</LinearLayout>
<LinearLayout
android:id="@+id/adViewContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</LinearLayout>
现在在onCreate()
setContentView(r.layout.layouts.);
adView = new AdView(this);
adView.setAdSize(AdSize.BANNER);
adView.setAdUnitId(AD_UNIT_ID);
// Adding AdView to container
final ViewGroup adViewContainer = (ViewGroup) findViewById(R.id.adViewContainer);
adViewContainer.addView(adView);
// Create an ad request. Check logcat output for the hashed device ID to
// get test ads on a physical device.
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.addTestDevice("INSERT_YOUR_HASHED_DEVICE_ID_HERE")
.build();
// Start loading the ad in the background.
adView.loadAd(adRequest);
从Android文档来看,RelativeLayout.ALIGN_PARENT_BOTTOM
是一个"将子页面的下边缘与其RelativeLayout父页面的下边缘对齐的规则",所以广告横幅将被放置在RelativeLayout的底部,而不一定是屏幕的底部。为了确保横幅放置在屏幕的底部,您需要扩展RelativeLayout以填充屏幕,您可以通过将RelativeLayout.LayoutParams.WRAP_CONTENT
更改为RelativeLayout.LayoutParams.MATCH_PARENT
来实现这一点。
编辑:这只会使横幅出现在RelativeLayout的父元素的底部,所以要确保RelativeLayout的底部边缘在屏幕的底部。
至于使用LinearLayout,我建议使用RelativeLayout,因为它更通用,可以容纳LinearLayouts,并且可能是解决这个特定问题的最简单的方法。
为了解决您对可变横幅高度的担忧,您将其设置为与密度无关的像素(dp),因此它只会在设备之间变化,而不是在同一设备(或模拟器)上多次启动应用程序之间变化。