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

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

ただいまの
回答率

90.32%

  • Android

    6738questions

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

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 954

KOGUMA

score 13

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 {
の部分に書こうとするとアプリがクラッシュしてしまいます。どうすればカクつかずに別レイアウトに表示させることができるんでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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/22 09:53

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

    キャンセル

  • 2016/03/22 10:40

    InterstitialAdは以下のように定義されているので
    同じActivity内であればthisでいいですが
    そうでなければ、定義したActivityからcontextを引っ張ってこないといけません

    public InterstitialAd (Context context)
    https://developers.google.com/android/reference/com/google/android/gms/ads/InterstitialAd#public-constructor-summary

    参考例:
    https://akira-watson.com/android/admob-interstitial2.html



    キャンセル

  • 2016/03/22 15: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.
    というエラーが出てしまいます。どうすれば良いのでしょうか?もしくは、もっと根本的なことを勘違いしてしまっているのでしょうか?

    キャンセル

  • 2016/03/22 16: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);
    }
    }

    こんな感じです。

    もし質問の内容が違うのであれば
    ちゃんとコードを出しましょう


    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/22 09: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.
    というエラーが出てしまいます。どうすれば良いのでしょうか?あるいは、もっと根本的なことを勘違いしてしまっているのでしょうか?

    キャンセル

  • 2016/03/22 16:34 編集

    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を読み込んだ後に、これらの中にビューを入れて使用するというのも手です。

    キャンセル

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Android

    6738questions

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