Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

プログラミング大好きベーシック Advent Calendar 2015の記事になります。
koitaroさんからバトンを受け取りました!

はじめに

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

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

今さら聞けない Activity と Fragment の使い分け
AndroidStudioの標準デザインパターンで分かるFragment入門

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

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

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

これが最強のFragmentテンプレート(ドンッ!!)

何はともあれコードを晒します。

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へのイベントコールバック

コードの頭にある

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

にてinterfaceの設定をしています。
また、onstartに以下のように設定することで

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

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

テンプレート
#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

kindから先ほど作成したテンプレートを選択すれば完了です。
Create_New_Class_と_MainActivity_java_-_FragmentTemplate_-____AndroidStudioProjects_FragmentTemplate_.png

これで爆速開発や!!!

もっとこうしたほうがええで!等のご意見大歓迎です。

githubにソースコード公開

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

明日はykyk1218さんです!
「2015年のまとめとして、Vimの設定を振り返る」とかなり気になる記事!
宜しくお願い致します!

kakky0418
Golangに入門
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away