アウトライン
本論文では、簡単な小さな例では、中に概説 Androidの開発、断片共通使用のは、唯一共有することを学ぶために、任意の不備場合、私を修正してください。
何であるフラグメントは?
断片は、機能又はユーザインタフェースの一部を表します。アクティビティの複数で構成することができるフラグメントマルチペインからなるUI 、フラグメントは複数の再使用することができるアクティビティです。あなたは置くことができる断片をとして活動する場合、その入力イベントを受け取るために、それは自身のライフサイクルを持って、モジュールの活動ランタイムが動的に追加して、「と同様に、削除することができますサブ活動」。
フラグメントは、いつものようにする必要がありアクティビティホストによってそのライフサイクルの一部のアクティビティのライフサイクルに影響を与えます。例えば:ときアクティビティが一時停止され、その含まれる全てのフラグメントはまた、懸濁され、場合アクティビティ場合が破壊、それに含まれるすべての断片が破壊される;しかしときアクティビティが実行されて、あなたはオペレーション分離することができる、断片を、そのような追加や削除など。
フラグメントデザイン
アンドロイドにアンドロイド3.0 (APIのレベル11 に導入された)フラグメント主に、より動的かつ柔軟に(錠剤など)大画面をサポートするために、UIのデザイン。タブレット画面は携帯電話よりもはるかに大きいので、これ以上結合する部屋との交換があるのUI コンポーネントが。活動レイアウトが分かれているフラグメント、実行するプログラムを変更することができるようになりますアクティビティ外観を、およびキャンペーン管理でスタックした後に行われた変更を保存します。
たとえば、ニュースアプリのAppは、あなたが使用できるフラグメントを相互に、左側の記事一覧を表示するフラグメント右ショーの記事---- 2 フラグメントはまた、中に表示される活動では、各フラグメントは、独自の生命を持っていますサイクルコールバックメソッドと収集し、独自のユーザー入力イベントを処理します。従って、ユーザは、同じであってもよい活動選択された記事ではなく、別に別々に使用することがアクティビティに示すように、図に示すフラットレイアウト。
それぞれがすべきフラグメントモジュラーおよび再利用可能なページ要素になるように設計します。各ので、他の言葉では、フラグメントは、独自のライフサイクル、コールバック関数、レイアウトや行動を持っている、それはより多くのことができる活動と同じに含まフラグメント。断片を避けるために、再利用するように設計されるべきフラグメント別のオペレーティングへの直接参照の断片を。モジュラーので、これは、特に重要であるフラグメントは、異なる組み合わせで異なる画面サイズに適応することができます。アプリケーションは、錠剤や携帯電話の両方をサポートする場合、異なるレイアウト構成の中で再利用できるフラグメント画面スペースに応じて、ユーザーエクスペリエンスを最適化するために、。
図 1 2方法の例断片が定義されたUIを上平板モジュールを設計する方法アクティビティディスプレイが、携帯電話に別々に示されています。
知識ポイントを含みます
知識ポイントは次のようにしている関係します:
- 断片化し、すべてのカスタム断片親クラスのを。
- FragmentManagerフラグメントマネージャオブジェクトは、動的に追加および交換するFragmentdのオブジェクトを。
- FragmentTransactionは表しフラグメントしなければならない、管理のを()コミット終わりを。
- onCreateView(LayoutInflater用インフレータ、のViewGroup容器、バンドルsavedInstanceState) メソッドを返しフラグメントがレイアウトビューに対応します。
- getFragmentManagerは()を返しフラグメントマネージャオブジェクトを。
作成フラグメントを
カスタム作成したい場合は、フラグメントを、あなたが作成しなければなりませんフラグメントのサブクラスを実装しなければなりません()onCreateView によって、方法をLayoutInflaterがにレイアウトファイルを埋める断片次のように、:
1 パブリック クラス RightFragmentは延び断片{ 2 3 プライベートのTextView tvMsgと、 4 5 @Override 6 パブリックビューonCreateView(LayoutInflater用インフレータ、のViewGroup容器、 7 バンドルsavedInstanceState){ 8 // このフラグメントのレイアウトを膨らま 9 Log.i( "TAG"、「-----------右回転----------- onCreateView: " ); 10 ビュービュー= inflater.inflate(R.layout.fragment_right、容器、偽)。 11 tvMsg =(のTextView)view.findViewById(R.id.tv_msg)。 12 リターン図です。 13 } 14 }
フラグメントのライフサイクル
フラグメントのライフサイクルとの活動のライフサイクルには多くの類似点があります。下図のように:
次のようにコンテンツを出力活性フラグメントコールバック:
1 05-30 22:16:02.207 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onAttach: 2 05-30 22:16:02.207 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onCreate: 3 05-30 22:16:02.207 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onCreateView: 4 05-30 22:16:02.216 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onAttach: 5 05-30 22:16:02.216 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onCreate: 6 05-30 22:16:02.216 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onCreateView: 7 05-30 22:16:02.218 29479-29479/com.hex.demofragment E/TAG: ------------Main-----------onCreate: 8 05-30 22:16:02.218 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onActivityCreated: 9 05-30 22:16:02.218 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onActivityCreated: 10 05-30 22:16:02.219 29479-29479/com.hex.demofragment E/TAG: ------------Main-----------onStart: 11 05-30 22:16:02.219 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onStart: 12 05-30 22:16:02.219 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onStart: 13 05-30 22:16:02.224 29479-29479/com.hex.demofragment E/TAG: ------------Main-----------onResume: 14 05-30 22:16:02.224 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onResume: 15 05-30 22:16:02.224 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onResume: 16 05-30 22:16:06.188 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onPause: 17 05-30 22:16:06.188 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onPause: 18 05-30 22:16:06.189 29479-29479/com.hex.demofragment E/TAG: ------------Main-----------onPause: 19 05-30 22:16:06.756 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onStop: 20 05-30 22:16:06.756 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onStop: 21 05-30 22:16:06.756 29479-29479/com.hex.demofragment E/TAG: ------------Main-----------onStop: 22 05-30 22:16:06.757 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onDestroyView: 23 05-30 22:16:06.757 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onDestroy: 24 05-30 22:16:06.757 29479-29479/com.hex.demofragment I/TAG: ------------Left-----------onDetach: 25 05-30 22:16:06.757 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onDestroyView: 26 05-30 22:16:06.757 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onDestroy: 27 05-30 22:16:06.757 29479-29479/com.hex.demofragment I/TAG: ------------Right-----------onDetach: 28 05-30 22:16:06.757 29479-29479/com.hex.demofragment E/TAG: ------------Main-----------onDestroy:
Activity中添加Fragment
Fragment是作为Activity的一部分而存在的,有两种方法可以将Fragment添加到Activity的布局文件中:
静态添加Fragment
在Activity的布局文件中直接声明Fragment,在这种情况下,您可以为Fragment指定布局属性,就像它是视图控件一样。例如,这里是包含两个片段的活动的布局文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:orientation="horizontal" 8 tools:context="com.hex.demofragment.MainActivity"> 9 <fragment 10 android:tag="left" 11 android:id="@+id/left_fragment" 12 class="com.hex.demofragment.LeftFragment" 13 android:layout_width="200dp" 14 android:layout_height="match_parent" 15 android:layout_weight="1"></fragment> 16 <fragment 17 android:tag="right" 18 android:id="@+id/right_fragment" 19 class="com.hex.demofragment.RightFragment" 20 android:layout_width="300dp" 21 android:layout_height="match_parent" 22 android:layout_weight="2"></fragment> 23 </LinearLayout>
如上所示:class 表示需要在视图中显示的fragment类,当系统创建Activity时,就会实例化Fragment并调用onCreateView方法,显示对应的布局文件。android:name和class表示的功能是一样的,需要其中一个即可。
备注:每个Fragment都需要一个唯一的标识符,如果Activity被重新启动的话,系统可以用它来恢复Fragment。
有三种方法可以为Fragment提供id:
- 提供android:id带有唯一的ID属性。
- 提供android:tag带有唯一字符串的标签属性。
- 如果没有提供前面两个中的任何一个,系统将使用容器视图的id。
动态添加Fragment
当Activity处于运行状态时,都可以将Fragment添加到页面布局中,只需要有一个ViewGroup用来存放即可。如下所示:
1 //FragmentManager是Activity内部用来与Fragment进行交互的接口 2 FragmentManager fm = getFragmentManager(); 3 FragmentTransaction ft=fm.beginTransaction(); 4 //将左侧Fragment和Frame控件关联起来 5 left=new LeftFragment(); 6 left.setTransData(transData); 7 ft.add(R.id.fl_left,left); 8 right=new RightFragment(); 9 ft.add(R.id.fl_right,right); 10 ft.commit();
如果要管理Activity中的Fragment,需要使用碎片管理器(FragmentManager),可以通过Activity中的getFragmentManager()方法来获得对象。
Fragment之间的传值
Fragment 作为独立的可重用的用户模块,应尽量避免相互引用,所以如何实现之间相互传值,就显得很重要,本文采用接口回调的方式进行传值。
具体如下:
1、定义一个传值接口,如下所示:
1 public interface ITransData { 2 public void transData(Bundle bundle); 3 }
2、在需要传值的Fragment中,定义接口属性对象,如下所示,左侧(LeftFragment):
1 private ITransData mTransData; 2 3 public void setTransData(ITransData transData){ 4 this.mTransData=transData; 5 } 6 7 @Override 8 public View onCreateView(LayoutInflater inflater, ViewGroup container, 9 Bundle savedInstanceState) { 10 11 View view = inflater.inflate(R.layout.fragment_left, container, false); 12 Button tv= (Button) view.findViewById(R.id.bn_left); 13 tv.setOnClickListener(new View.OnClickListener() { 14 @Override 15 public void onClick(View v) { 16 if(mTransData!=null){ 17 Bundle bundle=new Bundle(); 18 bundle.putString("name","我是左边"); 19 mTransData.transData(bundle); 20 } 21 } 22 }); 23 return view; 24 }
3、在Activity中,实现ITransData接口,并传给LeftFragment进行调用:
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_main2); 5 ITransData transData=new TransData(); 6 //FragmentManager是Activity内部用来与Fragment进行交互的接口 7 FragmentManager fm = getFragmentManager(); 8 FragmentTransaction ft=fm.beginTransaction(); 9 //将左侧Fragment和Frame控件关联起来 10 left=new LeftFragment(); 11 left.setTransData(transData);//将接口传递给LeftFragment 12 ft.add(R.id.fl_left,left); 13 right=new RightFragment(); 14 ft.add(R.id.fl_right,right); 15 ft.commit(); 16 }
4、在接口函数中调用获取左侧传回来的值,并调用RightFragment方法传递值。
1 protected class TransData implements ITransData 2 { 3 @Override 4 public void transData(Bundle bundle) { 5 String name=bundle.getString("name","空"); 6 if(right!=null){ 7 right.setTransData(name); 8 } 9 } 10 }
至此Fragment之间传值介绍完毕,总结一句话:Fragment通过接口传值,接口的实现在Activity中,实现松耦合。
备注
沧海月明珠有泪,蓝田日暖玉生烟。