全てのAndroid開発者に見て欲しい、これが最強のFragmentテンプレート

[プログラミング大好きベーシック Advent Calendar 2015](http://qiita.com/advent-calendar/2015/basicinc)の記事になります。
[koitaro](http://qiita.com/koitaro)さんからバトンを受け取りました！

# はじめに
みなさまFragmentは使ってますでしょうか？
Fragmentを使う事で機能を使いまわせてたり、Activityの見通しを良くしたりと多くのメリットがあります。

Fragmentの詳細については下記URL辺りがかなり参考になりました。有難うございます。


[今さら聞けない Activity と Fragment の使い分け](http://qiita.com/KeithYokoma/items/c41b22bda8c8d924d8cd)
[AndroidStudioの標準デザインパターンで分かるFragment入門](http://qiita.com/Hoshi_7/items/bee2588397348a4e0105)

ふむふむ、Fragmentわかったぞ！よっしゃ！これで作ったる( ｰ`дｰ´)
と思ってサンプルから作成すると最初は「？？」でした。

ある程度判るようになっても「うーんサンプルわかりずらいな…」と
ならば

####「俺がもっと簡単かつ実用的なFragmentテンプレート作ったる！('ω' )三('ω')三( 'ω')」


# これが最強のFragmentテンプレート(ドンッ！！)
何はともあれコードを晒します。

```java:framgent
package fragment.com.fragmenttemplate;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by kakizaki_shoichi on 15/12/09.
 * ProjectName FragmentTemplate
 */

public class FTemplate extends Fragment {

    /*interfaceを設定してActivityで呼べるようにする*/
    public interface OnClickListener {
        public void backBrowserTransaction();
    }

    private View mV;
    private Activity mActivity;
    private OnClickListener mListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mV = inflater.inflate(R.layout.fragment_main, container, false);
        return mV;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.mActivity = activity;
        if (activity instanceof OnClickListener == false) {
            throw new ClassCastException("activity が ClickListener を実装していません.");
        }
        mListener = ((OnClickListener) activity);
    }

    @Override
    public void onStart() {
        super.onStart();
         if (mListener != null) {
             mListener.backBrowserTransaction();
         }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }
}
```

## 軽く解説

### Activityへのイベントコールバック
コードの頭にある

```java:fragment
/*interfaceを設定してActivityで呼べるようにする*/
public interface OnClickListener {
	public void backBrowserTransaction();
}
```
にてinterfaceの設定をしています。
また、onstartに以下のように設定することで

```java:fragment
@Override
public void onStart() {
	super.onStart();
	if (mListener != null) {
		mListener.backBrowserTransaction();
	}
}
```

Activityにて下記のようにイベントコールバックを受け取る事が出るようになっています。

```
@Override
public void backBrowserTransaction() {
	Log.d("Activty", "通知ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!");	
}
```

Activity側でリスナーを登録していない場合は下記の部分でエラーを吐くようにしています。

```
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.mActivity = activity;
        if (activity instanceof OnClickListener == false) {
            throw new ClassCastException("activity が OnOkBtnClickListener を実装していません.");
        }
        mListener = ((OnClickListener) activity);
    }
```

# File and Code Templates機能でテンプレート化する
AndroidStudioはテンプレート作成することが出来ます。


## テンプレートを作成
Preferencesを開いたら検索窓に **File and Code Templates** と入力してください。
すると下記図のようになるので + を押下してテンプレートを作成します。
![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/49347/250c5db5-c40f-a757-d3ba-be2226f02b59.png "Preferences.png")

上記のコードをテンプレート化します

```java:テンプレート
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by ${USER} on ${DATE}.
 * ProjectName ${PROJECT_NAME}
 */

public class ${NAME} extends Fragment {

    /*interfaceを設定してActivityで呼べるようにする*/
    public interface OnClickListener {
        public void backBrowserTransaction();
    }

    private View mV;
    private Activity mActivity;
    private OnClickListener mListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mV = inflater.inflate(R.layout.fragment_news_footer, container, false);
        return mV;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.mActivity = activity;
        if (activity instanceof OnClickListener == false) {
            throw new ClassCastException("activity が ClickListener を実装していません.");
        }
        mListener = ((OnClickListener) activity);
    }

    @Override
    public void onStart() {
        super.onStart();
        if (mListener != null) {
             mListener.backBrowserTransaction();
         }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }
}
```
テンプレートを作成したら、右下のOKを押下してテンプレートの完成です。


## テンプレートを使う
New > Java Classを選択して新規ファイルを作成します。

![MainActivity_java_-_FragmentTemplate_-____AndroidStudioProjects_FragmentTemplate_.png](https://qiita-image-store.s3.amazonaws.com/0/49347/b482b3a5-7293-a5f5-3cef-a4c58f906b5e.png "MainActivity_java_-_FragmentTemplate_-____AndroidStudioProjects_FragmentTemplate_.png")



kindから先ほど作成したテンプレートを選択すれば完了です。
![Create_New_Class_と_MainActivity_java_-_FragmentTemplate_-____AndroidStudioProjects_FragmentTemplate_.png](https://qiita-image-store.s3.amazonaws.com/0/49347/69b8d65e-d335-b433-0a1d-8e50400f2471.png "Create_New_Class_と_MainActivity_java_-_FragmentTemplate_-____AndroidStudioProjects_FragmentTemplate_.png")



# これで爆速開発や！！！
もっとこうしたほうがええで！等のご意見大歓迎です。

#githubにソースコード公開
参考にしてください。(プルリクも大歓迎です)
https://github.com/Shoichi-Kakizaki/FramgentTemplate


明日は[ykyk1218](http://qiita.com/ykyk1218)さんです！
「2015年のまとめとして、Vimの設定を振り返る」とかなり気になる記事！
宜しくお願い致します！