AdMobの広告を非表示にダイナミックに切り替えたいケースについて、たとえば無料アプリは広告を表示して、有料版は広告なしにしたいけどレイアウトを崩したく無いケースなどでしょうか。
2021.1.1
AdMob Banner の設定
広告を画面の上部や底辺に張り付けるのは簡単ですが、広告の位置が他のUI部品の間に挿入されていて、非表示でのレイアウトも不自然にならないようにするには多少工夫が必要です。
以下は広告が画像に挟まれたレイアウトで、ボタンを押すスト広告が非表示になり、空いた隙間を埋めるかあるいは空けたままにする例です。
基本的なBanner広告設定ができている状態から始めます。
表示切替の設定
1. AdViewをコードで設定
1 2 3 4 5 |
// Test ID String adUnitID = "ca-app-pub-3940256099942544/6300978111"; AdView adMobView = new AdView(this); adMobView.setAdUnitId(AdUnitID); adMobView.setAdSize(AdSize.BANNER); |
2. 広告を表示したい箇所のIDを設定
1 2 3 4 5 6 |
<LinearLayout android:id="@+id/admob_layout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" > </LinearLayout> |
admob_layoutをidとしてLinearLayoutを定義してダイナミックに扱えるようにする
1 |
LinearLayout admobLayout = findViewById(R.id.admob_layout); |
3. AdViewをそのレイアウトに貼る
1 |
admobLayout.addView(adMobView); |
4. removeView()とadView()を使って広告をLinearLayoutから削除、追加して非表示・表示を行う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
boolean visibleAd = true; ... if (!visibleAd) { // admob 表示 admobLayout.addView(adMobView); admobLayout.setVisibility(LinearLayout.VISIBLE); adMobView.setVisibility(AdView.VISIBLE); visibleAd = true; } else { // admob 非表示 adMobView.setVisibility(AdView.GONE); admobLayout.removeView(adMobView); visibleAd = false; } |
Manifest, gradleの設定
ここではテスト用の App ID を使います。
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... android:theme="@style/AppTheme"> <!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 --> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3940256099942544~3347511713"/> <activity android:name=".MainActivity"> ... </activity> </application> </manifest> |
build.gradle
1 2 3 4 5 |
... dependencies { ... implementation 'com.google.android.gms:play-services-ads:20.6.0' } |
サンプルコード
以上を踏まえて作成します。
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
//package your.package.name; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.Button; import android.widget.LinearLayout; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdSize; import com.google.android.gms.ads.AdView; import com.google.android.gms.ads.MobileAds; public class MainActivity extends AppCompatActivity { private AdView adMobView; private LinearLayout admobLayout; private boolean visibleAd = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MobileAds.initialize(this); // Test ID String adUnitID = "ca-app-pub-3940256099942544/6300978111"; adMobView = new AdView(this); adMobView.setAdUnitId(adUnitID); adMobView.setAdSize(AdSize.BANNER); admobLayout = findViewById(R.id.admob_layout); admobLayout.addView(adMobView); AdRequest adRequest = new AdRequest.Builder().build(); adMobView.loadAd(adRequest); Button button = findViewById(R.id.button); button.setOnClickListener(v -> { if (!visibleAd) { // admob 表示 admobLayout.addView(adMobView); admobLayout.setVisibility(LinearLayout.VISIBLE); adMobView.setVisibility(AdView.VISIBLE); visibleAd = true; } else { // admob 非表示 adMobView.setVisibility(AdView.GONE); admobLayout.removeView(adMobView); visibleAd = false; } }); } } |
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:ads="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <ImageView android:src="@drawable/image_up" android:scaleType="centerCrop" android:layout_width="wrap_content" android:layout_height="250dp" android:contentDescription="@string/description1"/> <LinearLayout android:id="@+id/admob_layout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" > </LinearLayout> <ImageView android:src="@drawable/image_down" android:scaleType="centerCrop" android:layout_width="wrap_content" android:layout_height="250dp" android:contentDescription="@string/description2"/> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="20dp" android:text="@string/button" /> </LinearLayout> |
抜けた広告の隙間をそのままにしたい場合は
最初から LinerLayout の height を 50dp のように指定することもできます。
1 2 3 4 5 6 |
<LinearLayout android:id="@+id/admob_layout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="50dp" > </LinearLayout> |
strings.xml
1 2 3 4 5 6 |
<resources> <string name="app_name">YourAppName</string> <string name="button">Button</string> <string name="description1">a girl</string> <string name="description2">cherry</string> </resources> |
関連ページ:
- AdMob 広告を Android Studio で設定
- AdMob 表示、非表示の切り替え
- インタースティシャルの設置
- Interstitial 広告をクラスにまとめる