Androidラーニングシリーズ-Fragment

5883 ワード

Android Fragment
について
FragmentはActivityのサブモジュールを表しているので、FragmentはActivityフラグメントとして理解できる.Fragmentは、自分のライフサイクルに使用したり、自分の入力イベントを受け入れたりすることができます.
FragmentはActivityに「埋め込まれる」必要があるため、Fragmentも独自のライフサイクルを持っているが、FragmentのライフサイクルはActivityのライフサイクルによって制御される.たとえば、Activityが一時停止すると、Activity内のすべてのFragmentが一時停止します.Activityが破棄されると、Activity内のすべてのFragmentが破棄されます.Activityがアクティブな場合にのみ、プログラマはメソッドによって独立してFragmentを操作できます.
fragmentが導入されたのは、応答型の適合のためです.
例:tablet,phone

tablet-main-activity{
    navFragment + contentFragment
}

phone-main-activity {
    navFragment
}

phone-content-activity{
    contentFragment
}

Activityと同様にFragmentにも次のような状態がある.
  • アクティブ:現在のFragmentはフロントにあり、ユーザーが表示され、フォーカスを得ることができます.
  • 一時停止状態:他のActivityはフロントにあり、このFragmentは依然として見えますが、フォーカスは得られません.
  • 停止状態:このFragmentは表示されず、焦点を失う.
  • 破棄ステータス:Fragmentが完全に削除されたか、Fragmentが存在するActivityが終了した.

  • Fragmentフィーチャー
  • Fragmentは常にActivityインタフェースの構成部分として機能し、FragmentはgetActivity()メソッドを呼び出してその存在するActivityを取得し、ActivityはFragmentManagerのfindFragmentByld()またはfindFragmentByTag()メソッドを呼び出してFragmentを取得する.
  • Activityの実行中に、FragmentManagerのadd()、remove()、replace()メソッドを呼び出して、Fragmentを動的に追加、削除または置換できます.
  • —複数のFragmentを同時に組み合わせることができるActivity.逆に、1つのFragmentをマルチActivityで多重化することもできる.
  • Fragmentは、自分の入力イベントに応答し、自分のライフサイクルを持つことができますが、それらのライフサイクルは、その属するActivityのライフサイクルによって直接制御されます.

  • fragmentの作成
    fragmentクラス関係
     android.app.Fragment
     extends Object
     implements ComponentCallbacks2 View.OnCreateMenuListener
    
     subclass
     DialogFragment, ListFragment, PreferenceFragment, WebViewFragment

    ライフサイクルコールバックメソッド
     //   Fragment    Activity    。          
     onAttatch() 
    
     //     Fragment        ,             
     // Fragment        , fragment            。
     onCreate() ->
    
     //  Fragment             。         View,
     //  View    Fragment    View。
     onCreateView() ->
    
     //   Fragment     Activity            
     onActivityCreated()
    
     //    Fragment     
     onStart ->
    
     //    Fragment     ,onStart()        ()onResume()  
     onResume ->
    
     //       Fragment        。
     onPause ->
     onStop() ->
     
     //     Fragment      View      
     onDestroyView() ->
    
     //   Fragment    。          。
     onDestroy()  ->
    
     //    Fragment   Activity     、           ,onDestroy()
     //         onDetach()  。          。
     onDetach()
    

    開発Fragmentは開発Activityとよく似ていますが、開発ActivityはActivityまたはそのサブクラスを継承する必要があるだけです.しかし、Fragmentの開発にはFragmentとそのサブクラスを継承する必要があり、同時にActivityコールバックメソッドに書かれていたコードをFragmentのコールバックメソッドに「移動」すればよい.
    sample
    public class BookDetailFragment extends Fragment
    {
        public static final String ITEM_ID = "item_id";
        //    Fragment   Book  
        BookContent.Book book;
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            //      Fragment    ITEM_ID  
            if (getArguments().containsKey(ITEM_ID))
            {
                book = BookContent.ITEM_MAP.get(getArguments()
                .getInt(ITEM_ID)); //①
            }
        }
        //      ,      View   Fragment     
        @Override
        public View onCreateView(LayoutInflater inflater
        , ViewGroup container, Bundle savedInstanceState)
        {
        //   /res/layout/    fragment_book_detail.xml    
            View rootView = inflater.inflate(R.layout.fragment_book_detail,
            container, false);
            if (book != null)
            {
            //  book_title     book   title  
            ((TextView) rootView.findViewById(R.id.book_title))
            .setText(book.title);
            //  book_desc     book   desc  
            ((TextView) rootView.findViewById(R.id.book_desc))
            .setText(book.desc);
            }
            return rootView;
        }
    }

    Fragmentとactivityのインタラクション
    fragmentをactivityに適用する方法
  • レイアウトファイルに追加:レイアウトファイルに要素を使用してFragmentを追加します.android:nameプロパティはFragmentの実装クラスを指定する必要があります.
  • JavaコードでFragmentTransactionオブジェクトのrelpace()またはadd()メソッドによってFragmentを置き換えまたは追加します.ActivityのgetFragmentManager()メソッドはFragmentManagerに戻り、FragmentManagerのbeginTransaction()メソッドを呼び出してFragmentTransactionオブジェクトを取得します.

  • ActivityでFragmentを取得し、Fragmentでactivityを取得する方法:
  • Fragmentが存在するActivity:FragmentのgetActivity()メソッドを呼び出すと、その存在するActivityが返されます.
  • Activityが含むFragmentを取得するには、Activityに関連付けられたFragmentManagerのfindFragmentByld(int id)メソッドまたはfindFragmentByTag(String tag)メソッドを呼び出すと、指定したFragmentを取得できます.
  • インタフェースレイアウトファイルで要素を使用してFragmentを追加する場合、要素に対してandroid:idまたはandroid:tag属性を指定できます.この2つの属性はFragmentを識別するために使用できます.その後、ActivityはfindFragmentByld(int id)またはfindFragmentByTag(String tag)を使用してFragmentを取得できます.

  • FragmentとActivityは、データを相互に伝達する方法も必要かもしれません.
    ActivityからFragmentへのデータ転送:ActivityでBundleパケットを作成し、FragmentのsetArguments(Bundle bundle)メソッドを呼び出してBundleパケットをFragmentに転送します.
    FragmentがActivityにデータまたはActivityを渡すには、Fragmentの実行中にリアルタイムで通信する必要があります.Fragmentで内部コールバックインタフェースを定義し、Fragmentを含むActivityにコールバックインタフェースを実装させることで、Fragmentはコールバックメソッドを呼び出してActivityにデータを渡すことができます.
    FragmentManagementの機能
  • findFragmentByld()またはfindFragmentByTag()メソッドを使用して、指定されたFragmentを取得します.
  • popBackStack()メソッドを呼び出して、バックグラウンドからFragmentをポップアップします(ユーザーがBACKキーを押すのをシミュレートします).
  • は、addOnBackStackChangeListener()を呼び出して、バックグラウンドスタックの変化をリスニングするためのリスナーを登録する.Fragmentを追加、削除、置換する必要がある場合は、FragmentTransactionオブジェクトを使用する必要があります.FragmentTransactionは、ActivityがFragmentに対して実行する複数の変更を表します.

  • ragmentTransactionもFragmentトランザクションに翻訳されています.データベース・トランザクションと同様に、データベース・トランザクションは最下位配列に対する複数の更新操作を表します.Fragmentトランザクションは、ActivityがFragmentに対して実行する複数の変更操作を表します.
    各FragmentTransactionは、複数のadd()、replace()、remove()アクションを呼び出し、最後にcommit()を呼び出してトランザクションをコミットするなど、FragmentTransactionに対する変更を複数含めることができます.
    commit()を呼び出す前に、開発者はaddToBackStack()を呼び出してトランザクションをbackスタックに追加することもできます.このスタックはActivityが管理し、BACKボタンを押して前のFragment状態に戻ることができます.