質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

2回答

2453閲覧

Androidでadmobのクラッシュを直したい

KOGUMA

総合スコア24

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/03/11 06:32

編集2022/01/12 10:55

androidにadmobを導入しようと思ったのですが、画面のレイアウト(アクティビティではないです)を変更すると表示が消えてしまいます。
しかし、
interstitial = new InterstitialAd(this);
interstitial.setAdUnitId("xx-xxx-xxx-xxxxxxxxxxxxxxxx/xxxxxxxxxx");
// 広告リクエストを作成する。
AdRequest adRequestI = new AdRequest.Builder().build();
// インタースティシャルの読み込みを開始する。
interstitial.loadAd(adRequestI);

//バナー広告// AdRequest adRequest = new AdRequest.Builder().build(); AdView mAdView = (AdView) findViewById(R.id.adView); mAdView.loadAd(adRequest);

の内、
//バナー広告//
AdRequest adRequest = new AdRequest.Builder().build();
AdView mAdView = (AdView) findViewById(R.id.adView);
mAdView.loadAd(adRequest);

この部分を二か所に記述すると、レイアウトを変更するたびに読み込みが発生してカクついてしまいます。
でも
mAdView.loadAd(adRequest);
だけをもう一か所に記述するとスコープ外になってしまい、
AdRequest adRequestI = new AdRequest.Builder().build();
interstitial.loadAd(adRequestI);

public class MainActivity extends AppCompatActivity {
の部分に書こうとするとアプリがクラッシュしてしまいます。どうすればカクつかずに別レイアウトに表示させることができるんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。
まず、画面のレイアウトを変更(どういった事象か分かりませんが)すると表示が消えるという問題については
アクティビティの再生成やビュー(R.id.adView)の再生成がなされている可能性があります。

スコープ外についてはadRequestとmAdViewがローカル変数で他の関数から呼ばれてるのかと思います。

インターステイシャル広告についてですが、MainActivityのクラス内に書こうとするとクラッシュとありますが、どのように記述したのか不明でしたので、表示の方法のポイントだけ書いておきます。
・androidmanifestにmeta-dataやAdActivityは記述されているか
・ネットワーク権限は取得できているか
・AdUnitIdは指定されているか(インターステイシャル広告のユニットID)
・インターステイシャル広告読み込み完了後に広告を表示しているか(show)

できればもう少しコードとクラッシュ時のエラーも貼り付けていただけると助かります。

投稿2016/03/18 03:52

S-Rui_Sato

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOGUMA

2016/03/22 00:49

回答ありがとうございます!    AdRequest adRequest = new AdRequest.Builder().build(); AdView mAdView = (AdView) findViewById(R.id.adView); mAdView.loadAd(adRequest); これを setContentView(R.layout.activity_main); して画面を遷移した後に記述しないと表示が消えてしまいます。 処理がかくかくになってしまうので、 AdRequest adRequest = new AdRequest.Builder().build(); AdView mAdView = (AdView) findViewById(R.id.adView); この部分をメソッドの外に書いて、 mAdView.loadAd(adRequest); のみを記述すれば使えるようにしたいのですが、そうすると、 unfortunately xxxx has stopped. というエラーが出てしまいます。どうすれば良いのでしょうか?あるいは、もっと根本的なことを勘違いしてしまっているのでしょうか?
S-Rui_Sato

2016/03/22 07:36 編集

setContentView(R.layout.activity_main); を行ったのちに前述の3行を行わないと表示が消えてしまうのは、 (キャスト)findviewById(R..)自体が(キャスト)this.findviewById(R..)のためです。 おそらくKOGUMAさんのコードはR.layout.activity_mainの中にR.id.adViewというIDをもつビューが存在しているのではないでしょうか? そのためR.layout.activity_mainというUIをこのアクティビティにセット(this.setContentView)したのちでなければR.id.adViewというビューは存在しないことになり、そのためエラーが生じます。 グローバル変数(onCreateの外)で(AdView) findViewById(R.id.adView);を行ってしまうとグローバル変数はこのクラス生成時に呼ばれ、上述したのと同様にR.id.adViewというビューはまだ存在していない状態となりエラーとなります。 そのため、ajaさん記述のようにグローバル変数で private AdView mAdView; private AdRequest adRequest; というAdView とAdRequest を入れる箱だけ用意してあげて、OnCreateにおいてactivity_mainを読み込んだ後に、これらの中にビューを入れて使用するというのも手です。
guest

0

質問が複雑になっているようですのでbannerとnterstitialの問題を分けてテストしてみてください

public class MainActivity extends AppCompatActivity {
の部分に書こうとするとアプリがクラッシュしてしまいます

interstitial = new InterstitialAd(this);
これを定義したActivityでないからではないでしょうか

それに、バナー広告とInterstitialを2種類使っているようですが、IDはそれぞれのものを使わないといけませんが、どうでしょうか。
参考:
https://akira-watson.com/android/interstitial.html

投稿2016/03/15 01:19

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOGUMA

2016/03/22 00:53

回答ありがとうございます! IDはテスト用のを使っているので、かぶっていても大丈夫でした。 >interstitial = new InterstitialAd(this); >これを定義したActivityでないからではないでしょうか 申し訳ありません。まだ始めたばかりなので、どうしてそうするとエラーになってしまうのかわかりません。もし差し支えなかったら。もう少し詳しく教えていただけると幸いです!
KOGUMA

2016/03/22 06:07

何度も質問してしまい申し訳ありません。Interstitialに関する記述をすべてカットしてもエラーが出てしまいました。 AdRequest adRequest = new AdRequest.Builder().build(); AdView mAdView = (AdView) findViewById(R.id.adView); これをメソッドの中に入れるとほかの場所からは使えなくなってしまい、newをし直さなくてはいけなくなります。しかし、一番上の public class xxxx extends AppCompatActivity { の部分に記述してしまうと unfortunately xxxx has stopped. というエラーが出てしまいます。どうすれば良いのでしょうか?もしくは、もっと根本的なことを勘違いしてしまっているのでしょうか?
aja

2016/03/22 07:08

>public class xxxx extends AppCompatActivity { >の部分に記述してしまうと こういう場合は、コードで記述した方がいいですね 言葉の説明では不正確になります むしろコードを貼り付けてくれた方が説明されるよりよく分かる場合もあります ミスプリもありますから 質問の本質は AdMobをメソッドとしてActivity内でcallしたいということでしょうか その場合は、 public class MainActivity extends AppCompatActivity { private AdView mAdView; private AdRequest adRequest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAdView = (AdView) findViewById(R.id.adView); adRequest = new AdRequest.Builder().build(); showAdmob(); } private void showAdmob(){ mAdView.loadAd(adRequest); } } こんな感じです。 もし質問の内容が違うのであれば ちゃんとコードを出しましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問