Java 出现时android获取adMob横幅高度

Java 出现时android获取adMob横幅高度,java,android,eclipse,admob,Java,Android,Eclipse,Admob,我正在向我的应用程序成功添加adMob横幅。当横幅出现时,我需要得到它的高度,以便调整所有布局元素的大小。我正在使用事件onReceivedAd,这是正确触发的。但是,alturaBanner为=0。那么,如何得到它的高度呢?多谢各位 /** Called when an ad is received. */ @Override public void onReceiveAd(Ad ad) { adView.setVisibility(View.V

我正在向我的应用程序成功添加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。 使用下一个代码以获得正确的大小,无论您使用的是哪种设备/屏幕:

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),但这并不总是最好的方法(仅用于简单视图创建,不用于动态创建)


编辑:运行justbeforebeingdraw的替代方法:

当AdMob无法接收广告或接收到空广告(高度=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()。

我使用以下方法获取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()在全局布局状态或视图树中视图的可见性更改时触发。

实际上,如果您使用智能横幅类型显示横幅广告,则无需等待adview的出现即可获得adMob横幅高度

使用智能横幅,因为它会根据设备大小自动决定广告的高度。使用全屏幕显示广告

android开发者:

智能横幅是一种广告单元,可在任意屏幕大小的不同设备上以任意方向呈现屏幕宽度的横幅广告。智能横幅通过“智能”检测手机当前方向的宽度,并使广告视图达到该尺寸,有助于处理不同设备之间日益增加的屏幕碎片

有三种ad高度(dp、密度无关像素)可用:

32-当设备的屏幕高度小于400时使用
50-当设备的屏幕高度介于400和720之间时使用 90-当设备的屏幕高度大于720时使用

现在,获取AdView的高度并调整您希望放置横幅广告的版面边距。一旦广告加载(通过覆盖
onadloadded
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);
}
public static int getAdViewHeightInDP(活动){
int=0;
int screenHeightInDP=getScreenHeightInDP(活动);
如果(屏幕高度小于400)
八度=32;

否则,如果(screenHeightInDP您可以在任何类型的横幅添加到布局之前获取其高度

int heightPixels = AdSize.SMART_BANNER.getHeightInPixels(this);

还是迪普的

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\u BANNER
或您使用的任何横幅类型


以前的答案对我来说很有用,但也可以应用此方法!谢谢,+1以前的答案可能在某些设备上不起作用,也可能在将来的设备上不起作用。我的答案更通用,适用于任何视图,也适用于您使用的任何广告框架-如果您选择不同的广告框架,它仍然适用于您。我认为此答案适用于您不仅比另一个更好,考虑到最初的问题,即“如何获得adMob横幅高度”,它也更为尖锐。是的,另一个选择是使用“addOnGlobalLayoutListener”。@androiddeveloper我面临一个严重的问题。当广告出现时,即adView.setVisibilit(View.Visibilit)。我以编程方式添加的片段中的视图消失(可能会被销毁)有什么想法吗?到目前为止,AdSize.SMART_BANNER.getHeight(this);无效,getHeight()返回的是无意义的值(-2)。
AdSize.SMART_BANNER.getHeightInPixels(上下文)
就像一个符咒,这样我可以在加载广告时在运行时调整布局。该函数中的内部代码实际上与此处显示的智能横幅的计算相同
/** 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();
}