fragmentの静的ロードと動的ロード

6100 ワード

なぜFragmentを使うのかはもう言わないが、ネット上ではActivityよりもFragmentの方が柔軟だと紹介されている.どうしてですか.FragmentとActivityはどのようなつながりと違いがありますか?Activityが大きな箱だとすれば、Fragmentは大きな箱の中に物を分けた小さな箱であり、物を小さな箱に分けたほうが置き換えたり変更したりしやすく、インタフェースの変更やデザインも柔軟になることがわかります.ここではFragmentのエントリーで動的ロードと静的ロードを使用することに重点を置きます.
スタティツクローディング
特徴:FragmentはActivityのxmlファイルに直接埋め込まれており、fragmentコードの使用量は少ないが、柔軟性は低い.
Activityのxmlファイルに直接MyFragmentを埋め込み、MyFragmentを設計します.ここでは複数埋め込むこともできます.一例として.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragmentContainer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
	<fragment 
	    android:id="@+id/MyFragment"
	    android:name="com.example.learningtest1_fragment.MyFragment"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    />
</FrameLayout>

Fragmentはこのレイアウトファイルに対応し、インタフェース上のコントロールのレイアウトを制御します.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView 
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <Button 
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button"/>

</LinearLayout>

注意深く学友は1つの問題を発見したかもしれなくて、この2つのxmlファイル、Actvityのxmlファイルの中でfragmentを埋め込んで、fragmentのxmlファイルはインタフェースのコントロールのレイアウトを制御して、それでは両者の連絡点はどこですか?つまりactivtiyはどのfragmentをロードするかをどのように知っていますか?注意activityの行android:name=「com.example.learningtest 1_fragment.MyFragment」です.そう、クラス名に基づいてこのようなつながりを唯一識別しているのです.明らかに、私たちはまだMyFragmentのクラスを絆として必要としています.
package com.example.learningtest1_fragment;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

@SuppressLint("NewApi")
public class MyFragment extends Fragment{
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		/**
		 * resource: 
		 * root: layout viewgroup 
		 * false: viewgroup
		 */
		View view= inflater.inflate(R.layout.myfragment, container, false);
		TextView tv=(TextView)view.findViewById(R.id.text1);
		tv.setText(" fragment");
		return view;
	}
}

これにより、Activity表示時にfragmentのビューがインタフェースに表示されます.
 
ダイナミックロード
特徴:Activityのxmlに埋め込まれるのではなく、コードにFragmentMangerを使用してロードを制御します.この方式は柔軟性が高く、fragmentをコードで置き換え、増加、除去することができるが、その代価として、ロード制御に大量のコードが使用される.
同様に、クラスMyFragmnet 2を作成します.
package com.example.learningtest1_fragment;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

@SuppressLint("NewApi")
public class MyFragment2 extends android.app.Fragment{
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		/**
		 * resource: 
		 * root: layout viewgroup 
		 * false: viewgroup
		 */
		View view= inflater.inflate(R.layout.myfragment2, container, false);
		TextView tv=(TextView)view.findViewById(R.id.text1);
		tv.setText(" fragment");
		return view;
	}
}

これに対応するFragmnet 2.xmlファイルは次のとおりです.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
     <TextView 
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <Button 
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=" "/>

</LinearLayout>
コード内でfragmentのロードを制御する
 FragmentManager fm=getFragmentManager();
					    android.app.Fragment frame2=new MyFragment2();
                         android.app.FragmentTransaction	    ssss=fm.beginTransaction();
					    ssss.add(R.id.myframe, frame2);
				        ssss.commit();
主Activityのレイアウトにidを付けることで、fragmentのロード時に対応する場所を見つけることができます.
次のようになります.
<LinearLayout 
    android:id="@+id/myframe"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <TextView android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="abcdrffff"/>
</LinearLayout>
動的ロード時にid myframe:ssssが使用する.add(R.id.myframe, frame2);
これで、ダイナミックロードにも前後の論理フレームワークがあるのではないでしょうか.あまり読めなかったら、ソースをダウンロードして、対照的に見ることができます.