Android Fragment Lifecycle
今日はAndroid Fragment Lifecycleについて学び、androidアプリケーションに二つのフラグメントからなる単一のactivityクラスを実装します。
Android Fragment
Fragment
Androidのクラスは、動的なユーザーインターフェイスを構築するために使用されます。 Fragmentはアクティビティ内で使用する必要があります。 フラグメントの最大の利点は、複数の画面サイズのUIを作成するタスクを簡素化することです。 アクティビティには、任意の数のフラグメントを含めることができます。
Android fragmentは、それ自体が他のほとんどのUIコンポーネントであるViewのサブクラスではありません。 代わりに、フラグメントにはその内部にビューがあります。 フラグメントが存在するアクティビティの中に最終的に表示されるのはこのビューです。androidフラグメントはビューではないため、アクティビティに追加すると、ビュー(TextViewなど)を追加するのとは多少異なります。 フラグメントは、アクティビティ内のViewGroupに追加されます。 フラグメントのビューは、このViewGroup内に表示されます。
次の図は、フラグメントがアクティビティに追加されたときに何が起こるかを示しています。
最初に、アクティビティはフラグメ 次に、fragmentのビューが内部にレンダリングされるViewGroupへの参照を取得します。 次に、アクティビティはフラグメントを追加します。 次に、フラグメントはビューを作成し、アクティビティに返します。 その後、ビューはViewGroup親に挿入され、フラグメントは生きています。P>
フラグメントライフサイクル
Androidフラグメントライフサイクルは、下の画像に示されています。
以下は、フラグメントライフサイクルの方法です。
onAttach()
:このメソッドはonCreate()の前であっても最初に呼び出され、フラグメントがアクティビティにアタッチされていることを知らせます。 あなたのフラグメントをホストするアクティビティが渡されますonCreateView()
: Fragmentが初めてUIを描画するときに、システムはこのコールバックを呼び出します。 FragmentのUIを描画するには、fragmentのレイアウトのルートであるこのメソッドからビューコンポーネントを返す必要があります。 フラグメントがUIを提供しない場合、nullを返すことができますonViewCreated()
:これはonCreateView()の後に呼び出されます。 これはonCreateView()実装を継承するときに特に便利ですが、ListFragmentやアダプタを設定するときなど、結果のビューを設定する必要がありますonActivityCreated()
:これは、アクティビティのonCreate()が完了したことを示すために、oncreate()およびonCreateView()の後に呼び出されます。 アクティビティのonCreate()が作業を完了したことに依存するフラグメントで初期化する必要があるものがある場合は、その初期化作業にonActivityCreated()を使用できますonStart()
:フラグメントが表示されるとonStart()メソッドが呼び出されますonPause()
:システムはこのメソッドを最初の指示として呼び出しますユーザーがフラグメントを残していること。 これは通常、現在のユーザーセッションを超えて永続化する必要がある変更をコミットする場所ですonStop()
:Onstop()onDestroyView()
:onDestroy()の前に呼び出されます。 これは、UIをセットアップしたonCreateView()に対応しています。 UIに固有のクリーンアップが必要なものがある場合は、そのロジックをonDestroyView()onDestroy()
: ondestroy()は、フラグメントの状態の最終的なクリーンアップを行うために呼び出されますが、Androidプラットフォームによって呼び出されることは保証されません。onDetach()
:ondestroy()の後に呼び出され、フラグメントがホスティングアクティビティから切り離されたことを通知します
Android Fragment Classes
FragmentsはHoneycomb(API11)のAndroid APIに追加されました。p>
android.app.Fragment
:すべてのフラグメント定義の基本クラスandroid.app.FragmentManager
: アクティビティ内のフラグメントオブジェクトと対話するクラスandroid.app.FragmentTransaction
:フラグメント操作のアトミックセットを実行するクラス
Googleが提供する互換性パッケージライブラリを使用する場合、実装には以下のクラスが使用されます。
android.support.v4.app.FragmentActivity
android.support.v4.app.FragmentActivity
-
- : 互換性ベースのフラグメント(およびローダー)機能を使用するすべてのアクティビティの基本クラス
android.support.v4.app.Fragment
android.support.v4.app.FragmentManager
android.support.v4.app.FragmentTransaction
Android Fragment onCreateView()
その実装のためにoncreateview()を使用してフラグメント:
public class SampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_sample, parentViewGroup, false); return rootView; }}
onCreateView()
メソッドは、layoutinflater、viewgroup、およびbundleをパラメータとして取得します。p>LayoutInflater
は、レイアウトXMLファイルに基づいてビューインスタンスを作成できるコンポーネントです。 ご覧のとおり、この例では実際にはlayout.inflate()
を呼び出してそれを行います。inflate()
メソッドは、レイアウトXMLファイル(r.layout内)のid、フラグメントのビューが挿入される親ViewGroup、およびレイアウトXMLファイルから膨張したフラグメントビューを親ViewGroupに挿入するかどうかを示す第三のブール値を取ります。 この場合、呼び出したAndroidコードの一部によって、ビューが他の場所で親ViewGroupにアタッチされるため、falseを渡します。 最後のパラメータとしてfalseをinflate()に渡すと、親ViewGroupは膨張したビューのレイアウト計算に引き続き使用されるため、親ViewGroupとしてnullを渡すことはできません。onCreateView()のパラメータは、フラグメントのビューが挿入される親ViewGroupです。 これは、フラグメントを”ホスト”するアクティビティ内のViewGroupです。Bundle
onCreateView()のパラメータは、アクティビティと同じようにフラグメントがデータを保存できるバンドルです。Android Fragment Example
Android fragments example project comprises of a single activity holding two fragments: TextFragment and MenuFragment respectively.
Android Fragment Example Code
The
MainActivity
holds the two fragmentsTextFragment
andMenuFragment
. このアクティビティの一部であるフラグメントのクラスファイルがclass=”journaldev.com.fragments.fragments.TextFragment”として定義されていることがわかります。フラグメントクラスとそのレTextFragmentは、androidのバージョン名と番号を保持するtextviewsで構成されます。P>
package journaldev.com.fragments.fragments;import android.app.ListFragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ListView;import journaldev.com.fragments.R;public class MenuFragment extends ListFragment { String AndroidOS = new String { "Cupcake","Donut","Eclair","Froyo","Gingerbread","Honeycomb","Ice Cream SandWich","Jelly Bean","KitKat" }; String Version = new String{"1.5","1.6","2.0-2.1","2.2","2.3","3.0-3.2","4.0","4.1-4.3","4.4"}; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) { View view =inflater.inflate(R.layout.list_fragment, container, false); ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, AndroidOS); setListAdapter(adapter); return view; } @Override public void onListItemClick(ListView l, View v, int position, long id) { TextFragment txt = (TextFragment)getFragmentManager().findFragmentById(R.id.fragment2); txt.change(AndroidOS,"Version : "+Version); getListView().setSelector(android.R.color.holo_blue_dark); }}
list_fragment.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@android:id/list" /></LinearLayout>
MenuFragmentはListViewを表示します。 ここでわかるように、ListViewのレイアウトは、前の記事でListView用に作成したカスタムレイアウトとは対照的に、デフォルトのsimple_list_item_1です。
MainActivityはonCreateメソッドからsetContentViewを呼び出します。 フラグメントはxmlファイルから呼び出されます。または、以下のスニペットに示すように、
FragmentManager
を使用してactivityクラスからフラグメントを追加することもできます:getFragmentManager() .beginTransaction() .add(R.id.fragmentParentViewGroup, new MyFragment()) .commit();
ここでid fragmentParentViewGroupは、以下に示すFrameLayoutに属しています。
<FrameLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools" android:id="@+id/fragmentParentViewGroup" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MyActivity" tools:ignore="MergeRootFrame" />
Android Fragment Example App
以下は、私たちのプロジェクトによって生成された出力サイドフラグメント。あなたは下のリンクから最終的なandroidのフラグメントプロジェクトをダウンロードすることができます。
あなたは、以下のリンクから最終的なandroidのフラグメントプロジェクトをダウンロードすることができます。p>
-