2012年8月1日水曜日

AdmobをFragmentで実装しました

チームEGGの曽川です。

広告の処理をActivityごとに書くのが面倒だったので、AdMobをフラグメントで実装しました。(GoogleAdMobAdsSdk-6.1.0を使用)
まずはベースとなるAdmobFragmentクラスです。必要最低限の機能だけ実装しています。
/**
 * Admobのフラグメントです。
* ※このフラグメントを使用するとloadAdOnCreate=trueの状態となります。
 * 
 * @author sogawa
 * 
 */
public abstract class AdMobFragment extends Fragment {

    /** {@link AdView} */
    private AdView mAdView;

    /** {@link AdRequest} */
    private AdRequest mAdRequest;

    /**
     * {@inherited}
     */
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        mAdView = new AdView(getActivity(), getAdSize(), getUnitId());
        mAdRequest = new AdRequest();
        // リスナの設定
        final AdListener listener = getAdListener();
        if (listener != null) {
            mAdView.setAdListener(listener);
        }
        return mAdView;
    }

    /**
     * {@inherited}
     */
    @Override
    public void onActivityCreated(final Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mAdView.loadAd(mAdRequest);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mAdView.destroy();
    }

    /**
     * 広告のサイズを設定します。
     * 
     * @return {@link AdSize}
     */
    protected abstract AdSize getAdSize();

    /**
     * ユニットIDを指定します。
     * 
     * @return ユニットID
     */
    protected abstract String getUnitId();

    /**
     * {@link AdListener}を取得します。
* デフォルトでは何も行いません。
     * 
     * @return {@link AdListener}
     */
    protected AdListener getAdListener() {
        return null;
    }

}
次にAdMobFragmentを継承したAdMobFragmentImplクラスを作成します。
AdMobFragmentImplクラスではAdSize、UnitId、必要に応じてリスナを設定します。
public class AdMobFragmentImpl extends AdMobFragment {

    /**
     * {@inherited}
     */
    @Override
    protected AdSize getAdSize() {
        return AdSize.BANNER;
    }

    /**
     * {@inherited}
     */
    @Override
    protected String getUnitId() {
        return "XXXXXXXXXXXXXX";
    }
}
あとは、AdMobを入れたい箇所にFragmentの記述をするだけで、利用することができます。
<fragment
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        class="com.hoge.test.AdMobFragmentImpl" />
AdMobFragmentを共通のライブラリとして使い、AdMobFragmentImplをプロジェクトごとに実装すると使いやすいと思います。
※追記
2012/08/15 Admob読み込み中に中断するときに不具合がありましたので、onResumeで広告ダウンロードを停止する処理を削除しました。

2 件のコメント:

  1. こんにちは
    android.support.v4.app.Fragmentでは動きませんでした。
    java.lang.ClassNotFoundException: android.view.fragment in loader dalvik.system.PathClassLoader

    返信削除
  2. 自己解決しました。
    アクティビティが継承するクラスを変更していませんでした。
    Activity → FragmentActivityでしたね。

    失礼しました。

    返信削除