[Android] AdMob サイズをPublisherAdViewを使って動的に変える

AdMob広告はバナーか全画面のInterstitialだけではなく色々なサイズがあります。また、レイアウトの隙間にうまくはまるようにするにはPublisherAdViewを使うことができます。
 

Android Studio 2.3.3
Android 7.1.1

AdMob 広告サイズ

 
AdMobをいままでのSDK、あるいはFirebaseのどちらを使うかということはありますが、レイアウトはまた別の観点となります。
以下のフォーマットが現在サポートされています。
 

サイズ(幅×高さ) 説明 対応 広告サイズの定数値
320×50 標準のバナー スマートフォン、タブレット BANNER
320×100 バナー(大) スマートフォン、タブレット LARGE_BANNER
300×250 IAB レクタングル(中) スマートフォン、タブレット MEDIUM_RECTANGLE
468×60 IAB フルサイズ バナー タブレット FULL_BANNER
728×90 IAB ビッグバナー タブレット LEADERBOARD
画面の幅×32|50|90 スマートバナー スマートフォン、タブレット SMART_BANNER

バナー広告 | SDK for DFP Users on Android | Google Developers
 

BANNEr, SMART_BANNERが一般的ですが、カスタムでサイズを変更したい場合は PublisherAdView を使うとできるようです。
 

PublisherAdView

 
レイアウトの空いたところに広告を入れたいとすると、レイアウトの縦横のサイズを取得して設定します。と言っても横幅はスマホの場合は最大幅にしたほうが見やすので、高さがどれだけかになります。
 
getWidth()、getHeight()でサイズを取り出せますが、これはonCreate()では表示が完了していません。
onWindowFocusChanged(boolean hasFocus)
で表示されるタイミングでサイズを取得する必要があります。
 
そのサイズをAdSizeに設定することにより動的に広告サイズの変更が可能となります。
 

 
ただし、このAdSizeに設定するサイズは dp で入れないといけないので画面のdensityを取り出して計算することになります。
 
Firebase, あるいはGoogle Mobile Ads SDKによりAdMob広告を表示できるように設定されている前提で、これらをまとめると

MainActivity.java

レイアウトファイルですが、広告はLinearLayoutのad_layoutに設定しますので、layout_weightを使って空いているスペースを最大限取るようにします。

activity_main.xml

 
上下の高さを変えて、AdMob広告を空いているスペースに入るか試してみます。
(上の画像高さ/下の画像高さ)
 

100dp/200dp

150dp/300dp

100dp/400dp

 
広告スペースが大きくなりすぎると
「スペース全体にイメージ広告を表示しようとすると余白ができる場合は、画像が中央に配置され、両側のスペースは塗りつぶされます。」
となるようです。
 
 
関連ページ:

 
References:
バナー広告 | SDK for DFP Users on Android | Google Developers
PublisherAdView | Google APIs for Android | Google Developers