我正在向我的应用成功添加adMob横幅广告。当横幅出现时,我需要获得其高度以调整所有布局元素的大小。我正在使用事件onReceivedAd,这是正确触发的。但是,alturaBanner = 0.那么,如何获得它的高度?谢谢。
/** Called when an ad is received. */
@Override
public void onReceiveAd(Ad ad)
{
adView.setVisibility(View.VISIBLE);
int alturaBanner = adView.getHeight();
RelativeLayout.LayoutParams params1 = (android.widget.RelativeLayout.LayoutParams) browse2
.getLayoutParams();
params1.setMargins(0, alturaBanner, 0, 0);
Log.d(LOG_TAG, "onReceiveAd");
Toast.makeText(this, "onReceiveAd", Toast.LENGTH_SHORT).show();
}
答案 0 :(得分:16)
您可以在将任何类型的横幅添加到布局之前获得其高度。
int heightPixels = AdSize.SMART_BANNER.getHeightInPixels(this);
或
int heightPixels = AdSize.FULL_BANNER.getHeightInPixels(myContext);
或DIP的
int heightDP = AdSize.BANNER.getHeight();
因此,根据您的需要,您可以这样做:
/** Called when an ad is received. */
@Override
public void onReceiveAd(Ad ad)
{
adView.setVisibility(View.VISIBLE);
int alturaBanner = AdSize.BANNER.getHeight(); // This gets the adsize, even if the view is not inflated.
RelativeLayout.LayoutParams params1 = (android.widget.RelativeLayout.LayoutParams) browse2
.getLayoutParams();
params1.setMargins(0, alturaBanner, 0, 0);
Log.d(LOG_TAG, "onReceiveAd");
Toast.makeText(this, "onReceiveAd", Toast.LENGTH_SHORT).show();
}
只需将AdSize.BANNER
更改为AdSize.SMART_BANNER
或您使用的任何横幅广告类型。
答案 1 :(得分:6)
在准备之前获取视图的高度将始终返回0。 使用下一个代码以获得正确的大小,无论您拥有哪个设备/屏幕:
private static void runJustBeforeBeingDrawn(final View view, final Runnable runnable)
{
final ViewTreeObserver vto = view.getViewTreeObserver();
final OnPreDrawListener preDrawListener = new OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
runnable.run();
final ViewTreeObserver vto = view.getViewTreeObserver();
vto.removeOnPreDrawListener(this);
return true;
}
};
vto.addOnPreDrawListener(preDrawListener);
}
在给定的runnable中,您可以查询视图的实际大小。
或者,如果您愿意,可以使用addOnGlobalLayoutListener而不是addOnPreDrawListener。
另一种方法是使用onWindowFocusChanged(并检查hasFocus == true),但这并不总是最好的方式(仅用于创建简单视图,而不是用于动态创建)
编辑:runJustBeforeBeingDrawn的替代方案:https://stackoverflow.com/a/28136027/878126
答案 2 :(得分:2)
我使用以下方法获取AdView的高度:
adView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int height = adView.getHeight();
if (height > 0) {
// now the height is gotten, you can do things you want
}
}
});
当全局布局状态或视图树中视图的可见性发生变化时,会触发onGlobalLayout()。
答案 3 :(得分:1)
实际上,如果您使用智能横幅广告来展示横幅广告,则不需要等待广告内容的出现才能获得adMob横幅广告。
使用智能横幅,因为它会根据设备大小自动决定广告的高度。使用整个屏幕宽度来显示广告。
来自Android开发者site:
智能横幅是一种广告单元,可以在任意方向上跨不同设备在任何屏幕尺寸上呈现屏幕范围的横幅广告。智能横幅有助于解决不同设备之间不断增加的屏幕碎片问题。" smartly"检测手机当前方向的宽度,并使广告视图大小。
有三个广告高度(以dp为单位,与密度无关的像素):
32 - 当设备的屏幕高度小于400时使用 50 - 当设备的屏幕高度介于400和720之间时使用 90-当设备的屏幕高度大于720时使用
现在,获取AdView的高度并调整您希望放置横幅广告的布局边距。广告加载后(通过覆盖onAdLoaded
API),您可以使用以下方法知道高度:
public static int getAdViewHeightInDP(Activity activity) {
int adHeight = 0;
int screenHeightInDP = getScreenHeightInDP(activity);
if (screenHeightInDP < 400)
adHeight = 32;
else if (screenHeightInDP <= 720)
adHeight = 50;
else
adHeight = 90;
return adHeight;
}
public static int getScreenHeightInDP(Activity activity) {
DisplayMetrics displayMetrics = ((Context) activity).getResources().getDisplayMetrics();
float screenHeightInDP = displayMetrics.heightPixels / displayMetrics.density;
return Math.round(screenHeightInDP);
}
答案 4 :(得分:0)
当AdMob无法接收广告或收到空广告(height = 0)时,我也有同样需要能够展示自己的广告。
我根据AdView扩展RelativeLayout的事实使用以下代码:
mAdMobView = new AdView(pActivity, AdSize.SMART_BANNER, Constants.ADMOB_AD_UNIT_ID);
mAdMobView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(final View pV, final int pLeft, final int pTop, final int pRight, final int pBottom, final int pOldLeft, final int pOldTop, final int pOldRight, final int pOldBottom) {
final float lAdHeight = mAdMobView.getHeight();
if (lAdHeight == 0) {
Debug.i(LOG_TAG, "mAdMobView.onLayoutChange(...) mAdMobView.height='" + lAdHeight + "'. AdMob returned an empty ad !");
// Show custom ads
} else {
Debug.d(LOG_TAG, "mAdMobView.onLayoutChange(...) mAdMobView.height='" + lAdHeight + "'");
// Make AdView visible
}
}
});
mAdMobView.setAdListener(new AdListener() {
@Override public void onReceiveAd(final Ad pAd) {
Debug.d(LOG_TAG, "onReceiveAd(...) AdMob ad received (mAdMobView.visibility='" + mAdMobView.getVisibility() + "').");
}
@Override public void onPresentScreen(final Ad pAd) {
Debug.d(LOG_TAG, "onPresentScreen(...)");
}
@Override public void onLeaveApplication(final Ad pAd) {
Debug.d(LOG_TAG, "onLeaveApplication(...)");
}
@Override public void onDismissScreen(final Ad pAd) {
Debug.d(LOG_TAG, "onDismissScreen(...)");
}
@Override
public void onFailedToReceiveAd(final Ad pAd, final ErrorCode pErrorCode) {
Debug.i(LOG_TAG, "onFailedToReceiveAd(...) AdMob ad error (" + pErrorCode + ").");
// Show custom ads
}
});
每次Admob收到新广告时,都会执行'onLayoutChange'中的代码。
编辑:我的答案不合适,因为这个方法是在API 11中添加的......我改变它以使用onPreDraw(),如上一个答案所述。