9

我正在成功地将 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();
    }
4

5 回答 5

25

您甚至可以在将任何类型的横幅添加到布局之前获取其高度。

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.BANNERAdSize.SMART_BANNER您使用的任何横幅类型。

添加尺寸获取高度

于 2015-12-01T06:37:24.653 回答
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

于 2012-05-03T14:23:17.863 回答
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()。

于 2013-10-04T09:48:13.823 回答
2

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

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

来自 android 开发者网站

智能横幅广告单元可以在任何屏幕尺寸上以任一方向在不同设备上呈现全屏横幅广告。智能横幅通过“智能”检测手机在当前方向上的宽度,并使广告视图具有该尺寸,从而帮助处理不同设备上日益增加的屏幕碎片。

提供三种广告高度(以 dp 为单位,与密度无关的像素):

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

现在,获取 AdView 的高度并调整您希望放置横幅广告的布局的边距。加载广告后(通过覆盖onAdLoadedAPI),您可以使用以下方法知道高度:

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);
}
于 2015-07-10T18:36:40.027 回答
0

当 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() 如上一个答案中所述。

于 2012-08-16T15:29:47.903 回答