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

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 内で、ビューの実際のサイズを照会できます。

または、必要に応じて addOnPreDrawListener の代わりに addOnGlobalLayoutListener を使用できます。

別のアプローチは onWindowFocusChanged を使用することです (そして hasFocus==true であることを確認します) が、それが常に最善の方法であるとは限りません (動的な作成ではなく、単純なビューの作成にのみ使用します)

編集: runJustBeforeBeingDrawn の代替: https://stackoverflow.com/a/28136027/878126

于 2012-05-03T14:23:17.863 に答える
2

実際、バナー広告を表示するためにスマート バナー タイプを使用している場合、adMob バナーの高さを取得するために adview の出現を待つ必要はありません。

デバイスのサイズに基づいて広告の高さを自動的に決定するスマート バナーを使用します。画面の幅いっぱいに広告を表示します。

Android開発者サイトから:

スマート バナーは、さまざまなデバイスのあらゆる画面サイズに、いずれかの向きで画面全体にバナー広告を表示する広告ユニットです。スマート バナーは、現在の向きで携帯電話の幅を「スマートに」検出し、広告ビューをそのサイズにすることで、さまざまなデバイス間で増加する画面の断片化に対処するのに役立ちます。

3 つの広告の高さ (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
    }
});

「onLayoutChange」のコードは、Admob が新しい広告を受け取るたびに実行されます。

編集:このメソッドはAPI 11で追加されたため、私の答えは適切ではありません...前の回答で説明したように、 onPreDraw() を使用するように変更しました。

于 2012-08-16T15:29:47.903 に答える