Fragmentのテーマ

13558 ワード



Fragmentの概要


Fragmentは常にactivityに埋め込まれなければならず、それらのライフサイクルはその属する宿主、activityのライフサイクルに直接影響される.例えば、activityが一時停止されると、その中のすべてのfragmentも一時停止される.activityが破棄されると、それに属するfragmentもすべて破棄される.しかしながら、activityが実行する(resumed状態)場合、各fragmentを独立して操作することができ、例えば追加または削除することができる.fragmentをactivityレイアウトの一部として追加すると、activityのviewhierarchyのView Groupに存在し、独自のviewレイアウトが定義.
FragmentライフサイクルonAttach()FragmentがActivityにバインドされているときに呼び出される----->onCreate()Fragment作成-->onCreateView()Fragmentに関連付けられたView Hierarchyを作成するときに呼び出される-->onActivity Created()ActivityのonCreate()メソッドが戻るときに呼び出されます.この前の4つの状態は、ActivityのCreated-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroyView()がfragmentに関連付けられたview hierarchyが除去するときに呼び出される.この状態から最後までの3つの状態はいずれもActivityのDestroyed状態-->onDestroy()ActivityのonDestroy実行後のコールバックに対応し、--onDetach()はfragmentがactivityから関連を解除するときに呼び出される.
FragmentをActivityに追加する2つの方法
レイアウトの追加
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <fragment android:name="com.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
        <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>
<fragment>  android:name  layout  Fragment  .

各fragmentには一意の識別が必要です.activityが再起動すると、システムはfragmentを復元するために使用できます(fragmentをキャプチャしてトランザクションを処理するために使用することもできます.たとえば、削除します.)3つの方法でfragmentに識別を提供します:1.Android:id属性に一意のIDを提供する.android:tag属性に一意の文字列を指定します.3.以上の2つが提供されていない場合、システムは容器viewのIDを使用します.コード追加によりactivityが実行する場合、fragmentをactivitylayoutに追加できます.fragmentを配置する必要があるView Groupを簡単に指定するだけです.あなたのactivityでfragmentトランザクション(追加、削除、またはfragmentの代わりに)を操作するには、FragmentTransactionからのAPIを使用する必要があります.
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
//add() fragment  ViewGroup,  resource ID  , fragment
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();


UIのないFragmentを追加する前の例では、UIのサポートがactivityにfragmentを追加する方法を示しています.しかしながら、fragmentを使用する、追加のUIを表示することなくactivityにバックグラウンド動作を提供することもできる.UIのないfragmentを追加するには、view IDではなく、activityからadd(Fragment,String)を使用してfragmentを追加する必要がある.これによりfragmentが追加されましたが、activity layoutのビューに関連付けられていないため、onCreateView()呼び出しは受信されません.したがって、この方法を実現する必要はない.fragmentに文字列tagを提供することは、UIのないfragmentに特化するものではない、UIのあるfragmentに文字列tagを提供することもできるが、fragmentにUIがない場合、このtagはそれを識別する唯一の方法である.その後activityからこのfragmentを取得するにはfindFragmentByTag()を使用する必要があります.

Fragmentの管理activityでfragmentを管理するにはFragmentManagementを使用する必要があります.activityのgetFragmentManager()を呼び出すことでそのインスタンスを取得する.FragmentManagerでは、次のようなことができます.
findFragmentById()(activitylayoutでUIを提供するためのfragment)またはfindFragmentByTag()(UIのあるまたはないfragmentに適用)を使用してactivityに存在するfragment を取得します.
バックグラウンドスタックからfragmentをポップバックスタックからポップバックスタック()を使用する(ユーザがBACKコマンドを押すのをシミュレート).
addOnBackStackChangeListener()を使用して、バックグラウンドスタックの変化を監視するlistenerを登録します.

Fragmentトランザクションを処理する各トランザクションは同時に実行する一連の変化である.add()、remove()、replace()など、特定のトランザクションで実行したいすべての変更を設定できます.次にactivityにトランザクションを適用するにはcommit()を呼び出す必要があります.commit()を呼び出す前にaddToBackStack()を呼び出し、fragmentトランザクションのbackstackにトランザクションを追加したい場合があります.これは、1つのfragmentを別のものに置き換え、バックグラウンドスタックに以前の状態を保持します.
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();

この例では、newFragmentは、現在のlayoutコンテナのR.id.fragment_を置き換えます.container標識fragment.addToBackStack()を呼び出すことでreplaceトランザクションがback stackに保存されるため、ユーザはトランザクションをロールバックすることができ、BACKボタンを押すことで前のfragmentに持ち帰ることができる. FragmentStatePagerAdapterは、Fragmentが自動的に保存され、復元されます.

Fragmentの本当のonPauseとonResume

FragmentにはonResume()onPause()の方法がありますが、この2つの方法はActivityの方法で呼び出しタイミングもActivityと同じで、ViewPagerと組み合わせてこの方法を使うととても腹立たしくて、まったくあなたが望んでいる効果ではありません.ここで1つの方法を紹介します.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Fragment onResume
    } else {
        // Fragment onPause
    }
}
ViewPagerPageAdapterに関連するコードを読むことによって、Fragmentを切り替えることは、実際にはsetUserVisibleHintsetMenuVisibilityを設定することによって実現され、この方法を呼び出すときにFragmentを解放することはありません(すなわち、onDestoryViewは実行されません).