Basefragmentのパッケージ使用

12458 ワード

転載は出典を明記してください.http://blog.csdn.net/q649381130?viewmode=contents(漆可のブログ)
1、はじめに
パッケージはオブジェクト向けの3つの特性の1つとして、私たちの普段のcodingプロセスで使われているものは非常に多いです.ほとんどの場合、パッケージの状況に基づいてコードの品質レベルを評価することができます.
本文は主にfragmentのパッケージについて説明する.大体、プロジェクトの初期には、サブクラスの呼び出しを容易にするために、ベースクラスによく使われるものをカプセル化します.このメリットは明らかです.
  • 共通のものをbaseベースクラスに集中する
  • 後期修正メンテナンス
  • 便利
  • サブクラスコード冗長性を回避
  • 不要な重複コードを消去
  • 便利サブクラスの使用
  • 2、パッケージの開始
    2.1 mActivityの取得
    fragmentでは、getActivity()メソッドで現在添付されているactivityインスタンスを取得できます.ただし、使用中にポインタが空になる場合がある場合は、fragmentライフサイクルのonAttach(Context context)メソッドでグローバル変数に取得して昇格することができます.
        /** *    activity */
        protected FragmentActivity mActivity;
    
        @Override
        public void onAttach(Context context)
        {
            super.onAttach(context);
    
            mActivity = getActivity();
        }

    2.2 onCreateViewメソッドのパッケージ
    通常、fragmentのonCreateViewメソッドでは、レイアウトファイルのロード、findview、ネットワークのデータのロード、データの初期化などの初期化を行う必要があります.これらのことを1つの方法に書くと、onCreateViewは非常に膨大で、いくつかの方法に分けて抽出することができます.コードが美しく、読みやすいようにします.
        @Override
        @Nullable
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                @Nullable Bundle savedInstanceState)
        {
            mRootView = inflater.inflate(setLayoutResouceId(), container, false);
    
            initData(getArguments());
    
            initView();
    
            mIsPrepare = true;
    
            onLazyLoad();
    
            setListener();
    
            return mRootView;
        }

    上記のコードは機能に基づいて以下のパッケージを行い、メソッド呼び出しの順序が変更できないことに注意します.
  • setLayoutResouceId():レイアウトリソースid
  • を設定する
  • initData(getArguments():データ初期化、主にactivityからパケットを取り外して渡されるパラメータ、アダプタ初期化、集合初期化などを含み、viewの操作を行うことができない
  • mIsPrepareをtrueに設定:mIsPrepareはviewがロードされたかどうかを示し、このプロパティは主に怠け者(以下、怠け者のロードについて詳細に説明する)
  • に使用される.
  • onLazyLoad():怠惰にデータをロードし、oncreatviewメソッドで呼び出すことは直接データをロードすることと理解でき、メソッドではviewの操作を行うことができる
  • setListener():各種傍受イベントの統一設定
  • 2.3 field紹介
    カプセル化された属性コードの注釈はすでにはっきり書かれています.
       /** *    activity */
        protected FragmentActivity mActivity;
    
        /** *  view */
        protected View mRootView;
    
        /** *         */
        protected boolean mIsVisible;
        /** *        *     oncreatview,View            true */
        protected boolean mIsPrepare;

    2.4パッケージの方法
    次の3つの方法は、サブクラスの実装に使用されます.
        /** *       * @author    * @date 2016-5-26   3:57:48 * @param arguments                  */
        protected void initData(Bundle arguments)
        {
    
        }
    
        /** *    View * @author    * @date 2016-5-26   3:58:49 */
        protected void initView()
        {
    
        }
    
        /** *        * @author    * @date 2016-5-26   3:59:36 */
        protected void setListener()
        {
    
        }

    2.5 setLayoutResourceIdメソッド
    setLayoutResouceId()は、レイアウトファイルのリソースidを取得し、fragmentにロードし、onCreatviewメソッドでmRootViewで参照を保存するためにサブクラスを実装する抽象的な方法です.
        /** *        id * @author    * @date 2016-5-26   3:57:09 * @return */
        protected abstract int setLayoutResouceId();

    2.6専属のfindViewById()を作成する方法
    activityのfindView ById()メソッドがうらやましいのではないでしょうか.私たちがカプセル化したbasefragmentにも、強制的に変換する必要がなく、独自のfindView ById()メソッドがあり、activityよりも強力です.それがあれば、私たちのfragmentサブクラスは直接使用することができます.
        @SuppressWarnings("unchecked")
        protected <T extends View> T findViewById(int id)
        {
            if (mRootView == null)
            {
                return null;
            }
    
            return (T) mRootView.findViewById(id);
        }

    2.7リラクゼーション
    怠惰なロードとは、viewがユーザーと対話していないとロードされませんが、彼のロード順序は非常に速いです.この方法は主にviewpagerネストfragmentで多く用いられる.viewpagerは、左右に指定された数(もちろんこの数はsetOffscreenPageLimit(int limit)設定)のfragmentを事前にロードすることができ、怠け者のロードを使用すると、他のページのネットワークリクエストを事前に実行しないようにviewの作成などの操作しかできません.
    コードの中で、setUserVisibleHint(boolean isVisibleToUser)はユーザーと対話可能かどうかを表し、onCreatviewメソッドの前で実行し、isVisibleToUserがtrueの場合はユーザーに見えることを示し、ここではカスタムonVisibleToUser()メソッドを実行し、onVisibleToUser()では、判断を行います.mIsPrepareがtrueであり、ユーザと対話可能である場合、我々のonLazyLoad()メソッドを実行して怠惰なロードを行います.
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser)
        {
            super.setUserVisibleHint(isVisibleToUser);
    
            this.mIsVisible = isVisibleToUser;
    
            if (isVisibleToUser)
            {
                onVisibleToUser();
            }
        }
    
        /** *            * @author    * @date 2016-5-26   4:09:39 */
        protected void onVisibleToUser()
        {
            if (mIsPrepare && mIsVisible)
            {
                onLazyLoad();
            }
        }

    3終了
    はい、basefragment全体のパッケージができました.次は完全なコードです.コード量が少ないので、このブログは完全なdemoをアップロードしません.
    public abstract class BaseFragment extends Fragment {
        /** *    activity */
        protected FragmentActivity mActivity;
    
        /** *  view */
        protected View mRootView;
    
        /** *         */
        protected boolean mIsVisible;
        /** *        *     oncreatview,View            true */
        protected boolean mIsPrepare;
    
        @Override
        public void onAttach(Context context)
        {
            super.onAttach(context);
    
            mActivity = getActivity();
        }
    
        @Override
        @Nullable
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                @Nullable Bundle savedInstanceState)
        {
            mRootView = inflater.inflate(setLayoutResouceId(), container, false);
    
            initData(getArguments());
    
            initView();
    
            mIsPrepare = true;
    
            onLazyLoad();
    
            setListener();
    
            return mRootView;
        }
    
        /** *       * @author    * @date 2016-5-26   3:57:48 * @param arguments                  */
        protected void initData(Bundle arguments)
        {
    
        }
    
        /** *    View * @author    * @date 2016-5-26   3:58:49 */
        protected void initView()
        {
    
        }
    
        /** *        * @author    * @date 2016-5-26   3:59:36 */
        protected void setListener()
        {
    
        }
    
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser)
        {
            super.setUserVisibleHint(isVisibleToUser);
    
            this.mIsVisible = isVisibleToUser;
    
            if (isVisibleToUser)
            {
                onVisibleToUser();
            }
        }
    
        /** *            * @author    * @date 2016-5-26   4:09:39 */
        protected void onVisibleToUser()
        {
            if (mIsPrepare && mIsVisible)
            {
                onLazyLoad();
            }
        }
    
        /** *    ,       view           * @author    * @date 2016-5-26   4:10:20 */
        protected void onLazyLoad()
        {
    
        }
    
        @SuppressWarnings("unchecked")
        protected <T extends View> T findViewById(int id)
        {
            if (mRootView == null)
            {
                return null;
            }
    
            return (T) mRootView.findViewById(id);
        }
    
        /** *        id * @author    * @date 2016-5-26   3:57:09 * @return */
        protected abstract int setLayoutResouceId();
    }

    私の次のブログを楽しみにしてください:カスタム注釈を利用してコードを簡素化します