フラグメント運用
5324 ワード
FragmentはAndroid honeycomb 3.0に追加された概念で、Fragmentの名前は破片だがActivityとよく似ているので、Android Fragmentの役割と使い方を紹介します.Fragmentは、1つのActivityにおいて、いくつかの動作または一部のユーザインタフェースを記述するために使用する、複数のfragmentを結合して1つのactivityに複数のUIパネルを構築し、同時にfragmentを複数のactivityに再利用することができる.fragmentはactivityのモジュールとして考えられ、fragmentには独自のライフサイクルがあり、独自の入力イベントを受信し、実行中のactivityを追加または削除することができます.
1つのfragmentは常にactivityに埋め込まれなければならないが、fragmentのライフサイクルはactivityによって影響され、例を挙げて、activityが一時停止すると、このactivityにあるすべてのfragmentsがdestroyによって解放される.しかし、resumeなどのactivityが実行されている場合は、追加や削除などのfragmentを個別に操作できます.
FragmentはAndroid 3.0の新しい特性として、図のように2つのActivityを統合するなど、強力な機能もあります.
2つのActivityが2つのFragmentを介して1つのActivityに統合されたレイアウトを見ることができ、タブレットなどの大画面デバイスにとって良い展示パネルを持っています.しかし、FragmentとActivityのライフサイクルは複雑なので、それぞれ比較してみましょう.
fragmentを作成するには、次のコードのようなFragmentのサブクラスまたは存在するサブクラスを作成する必要があります.
public static class Android123Fragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.android123_fragment, container, false);
}
}
FragmentクラスのいくつかのコードはActivityのように見えます.皆さんに理解してもらうために、Fragmentのライフサイクルを整理します.上図のように、Activityのようなものがあります.詳しく説明します.
onCreate()fragmentが作成されたときに呼び出される場合は、fragmentが一時停止または停止したときにリカバリする必要があるなど、実用的なコンポーネントを初期化する必要があります.
onCreateView()システムがfragmentを呼び出して初めてユーザーインタフェースを描画するとき、UIを描くとfragmentに戻らなければなりません.もちろんnullに戻ってこのfragmentにUIがないことを表すことができます.
では、ActivityにFragmentを追加するにはどうすればいいのでしょうか.Activityのレイアウトはこのように書くことができます
<?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.android123.cwj.ArticleListFragment"
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.android123.cwj.ArticleReaderFragment"
android:id="@+id/viewer"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
最後にFragmentがActivityのView Groupに存在することを注意し、継承関係によって彼の構造を知ることができ、Android 3.0のコードはまだオープンソースではないため、テストはAndroid honeycombバージョンのシミュレータからしか行われません.
Fragmentの管理制御、パフォーマンスの最適化、およびActivityとの転送に関するコンテンツ.
一、管理Fragment
ActivityでFragmentを管理するにはFragmentManagerというクラスを使用し、getFragmentManager()メソッドを呼び出してActivityクラスをインスタンス化する必要があります.FragmentManagerクラスの主な方法はfindFragmentById()を使用してActivityのFragmentレイアウトを取得することです.もちろんfindFragmentByTag()のような方法もあり、唐Fragmentでスタックを出たpopBackStack()と同時にaddOnBackStackChangedListener()管理を登録することができる.具体的にはandroid.app.FragmentManagerクラスの詳細
二、Fragment事務処理の最適化
良い特性は、fragmentを追加、削除、置換する際にActivityでFragmentTransactionクラスを使用してバッチ処理の効率を向上させることができ、SQLiteのデータベース更新原理と似ています.
FragmentManager fragmentManager = getFragmentManager(); // fragmentmanager
FragmentTransaction transaction = fragmentManager.beginTransaction(); // begintransaction 。
その間にadd()、remove()、およびreplace()を用いることができる.最終的に変更が必要な場合はcommit()を実行し、コードを書きます.
transaction.replace(R.id.fragment_container,newFragment);
transaction.addToBackStack(null);
transaction.commit();
三、FragmentとActivityが互いに通信する
通常Fragmentには通常標準のコントロールやカスタムのコントロールを入れますが、基本的にActivityと同じですが、どのようにFragmentのViewレイアウトもActivityに置くかには、2つの方法があります.
View listView = getActivity().findViewById(R.id.cwj);//getActivityメソッドでは、Activityのfragmentを取得できます.ここでcwjはfragmentです.activityのレイアウトは次のとおりです.
<?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.android123.cwj.ArticleListFragment"
android:id="@+id/cwj"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.android123.cwj.ArticleReaderFragment"
android:id="@+id/smart"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
もちろん、getFragmentManagerメソッドで取得するインスタンスもあります.ExampleFragment fragment=(ExampleFragment)getFragmentManager()です.findFragmentById(R.id.cwj);