Fragmentの使い方(公式文書の翻訳)

59834 ワード

ダイナミックなマルチインタフェース切り替えが必要な場合は、UI要素とActivityをモジュールに融合させる必要があります.2.3において,多界面のホッピングと単一界面の動的変化を,一般に種々のActivityでホッピングすることによって達成した.4.0以上のシステムでは、この効果であるFragmentクラスを容易に達成するために、新しい特性を使用することができます.FragmentはネストActivityのように、自分のlayoutと自分のライフサイクルを定義することができます.
 
複数のFragmentは、1つのActivityに配置することができ(したがって、上述したようにネストされたActivityのように)、これらのFragmentは、タブレットや携帯電話などの異なる画面サイズに適応するように構成することができる.
 
次に、Fragmentを使用してユーザーに動的な体験を提供する方法と、異なる画面サイズを最適化して、ユーザーにより良い使用体験を提供する方法について説明します.この特性はAndroid 1で実行することができる.6上(もちろんgoogleライブラリのサポートが必要です).(all while continuing to support devices running versions as old as Android 1.6.この本心が分からなかったので、E文の良い同級生が教えてくれた)
 

Androidライブラリの使用


Androidサポートライブラリはjarファイルで、このサポートライブラリを使用して低バージョンで高バージョンの特性を実行することができます(例えばFragmentは1.6の特性ではありませんが、ライブラリの導入によってfragmentを含むプログラムを1.6上に実行し、プログラムの互換性を保証することができます).
手順:1.Android Support PackageをSDK Managerでダウンロードします.
 2. プロジェクトコードの最上位にlibsフォルダを作成し、必要なjarライブラリファイルをlibsにコピーします.3.manifestファイルを更新し、以下のように設定する
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />

古いシステムで新しいapiプロパティが使用されていないことを確認するために、Fragmentを使用するファイルには次の内容が含まれます.
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;

Fragmentsを含めるには、ActivityではなくFragmentActivityを宣言する必要があります.

Fragmentの作成


Fragmentは独立したActivityと見なすことができ、独自のライフサイクルを持ち、個別のトリガイベントを取得し、Activityが実行されている間にFragmentを動的に削除または追加することができます.もっと面白いのは、このFragmentを他の場所で再利用することができます.このセクションでは、サポートライブラリを導入し、Fragmentを継承することによって、Fragmentを含むプログラムを低バージョン(最低1.6版)で実行し、プログラムの互換性を保証することを示します.Fragmentクラスの作成
Activityクラスを作成するように、Fragmentを継承し、ライフサイクルの重要な関数を実現し、自分の機能コードを中に入れることを覚えています.Fragmentを作成するには、onCreateView()を使用してlayoutレイアウトファイルを定義する必要があります.実際には、Fragmentを実行できる唯一のコールバック関数です.次の例を見てみましょう.
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;

public class ArticleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.article_view, container, false);
    }
}

Activityよりずっと簡単ではないでしょうか.もちろん、ActivityのようにFragmentも他のライフサイクルの関数を実装する必要があります.そうすれば、彼の追加削除を実現することができます.たとえば、activityがonPause()メソッド呼び出しを受信すると、その中のFragmentもonPause()に呼び出されるので、機会を見て、Fragmentの中のonPause()にあなたの書いたコードを入れましょう.
もっと詳しいFragmentはこちらを参考にしてください
.
XMLを使用してActivityにFragmentを追加
Fragmentを再利用する場合、インスタンス化されたFragmentは親FragmentActivityに依存する必要があります.この親アクティビティのレイアウトファイルxmlでfragmentを定義できます.次に、アクティビティに2つのFragmentを追加した例res/layout-large/news_を示します.articles.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment android:name="com.example.android.fragments.HeadlinesFragment"
              android:id="@+id/headlines_fragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

    <fragment android:name="com.example.android.fragments.ArticleFragment"
              android:id="@+id/article_fragment"
              android:layout_weight="2"
              android:layout_width="0dp"
              android:layout_height="match_parent" />

</LinearLayout>

見たかどうかは、一般的なedittext空間の追加と何の違いもないので、簡単でしょう.
Tip:
より多くのスクリーンサイズをサポートするレイアウトを作成する方法を知りたい場合は、この文書を参照してください.
.
次に、このレイアウトのコードを使用する方法を示します.
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);
    }
}

Note:xmlでfragmentを定義することで、実行時にfragmentを削除することはできません.fragmentsを切り替えてユーザーとより良いインタラクションをしたい場合は、activityが起動したときにfragmentを定義する必要があります.

より柔軟なUIの作成(ステップアップアプリケーション)


さまざまなスクリーンサイズのデバイスに対してアプリケーションを設計する場合、fragmentsを異なるレイアウトファイルで再利用してお客様に最適化を体験させることができます.例えばタブレットや携帯電話ではfragmentを使用すると、表現が全く異なる可能性があります.タブレットの上には前後の2つのFragmentを画面に表示することができます(画面空間は十分に表示され、画面空間をスペースにすることはありません).携帯電話の2つのFragmentは切り替え表示しかできません.携帯電話の画面空間が小さすぎて、一度に1画面しか表示できません.画像は以下の通りです.
クラスFragmentManagerでは、実行時にactivityのfragmentsを追加、削除、上書きする方法を提供し、お客様に動的でより優れた体験を提供します.実行時にActivityの前節のactivityのレイアウトファイル(layout xml)にFragmentを追加する方法がわかりました.実行時にfragmentを動的に表示および非表示にできる別の方法を学習します.ActivityでFragmentを動的に管理するには、FragmentManagerを使用し、FragmentTransaction(Fragment操作の列api、add/attach/detach/hideなど)を作成する必要があります.
activityでfragmentsを動的に除去または置換する必要がある場合は、onCreate関数で初期化されたfragmentsをactivityに追加する必要があります.Fragmentsを処理する際、特に実行中に動的に追加されるfragmentsには、fragmentsのlayoutレイアウトを収容するためにfragmentにコンテナViewが必要であるという重要なルールがあります.次のlayoutは、前のセクションの代わりに、毎回1つのfragmentしか表示されません.現在のfragmentを置き換えるには、このactivityのlayoutにfragmentコンテナとして使用するFrameLayoutが含まれている必要があります.注意:このレイアウトファイルのファイル名は前節と同じですが、layoutフォルダにはlarge修飾がないので、わかります.(分からなければ大丈夫です.説明:large修飾がないので、このlayoutはlargeより小さい画面に使われています.このように画面は毎回1つのfragmentしか表示できません.上図のタブレットのように2つのfragmentを表示できません).res/layout/news_articles.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

あなたのactivityでgetSupportFragmentManager()関数でFragmentManagerを取得します.beginTransactionを使用してFragmentTransactionを作成し、add()関数を呼び出してFragmentを追加します.FragmentTransactionで複数回fragment関連の操作を実行できます.切り替える準備ができたら、関数call()を呼び出せばいいです.
次はfragmentをlayoutに追加します.
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.news_articles);

        // Check that the activity is using the layout version with
        // the fragment_container FrameLayout
        if (findViewById(R.id.fragment_container) != null) {

            // However, if we're being restored from a previous state,
            // then we don't need to do anything and should return or else
            // we could end up with overlapping fragments.
            if (savedInstanceState != null) {
                return;
            }

            // Create an instance of ExampleFragment
            HeadlinesFragment firstFragment = new HeadlinesFragment();
            
            // In case this activity was started with special instructions from an Intent,
            // pass the Intent's extras to the fragment as arguments
            firstFragment.setArguments(getIntent().getExtras());
            
            // Add the fragment to the 'fragment_container' FrameLayout
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.fragment_container, firstFragment).commit();
        }
    }
}

実行時にFrameLayoutコンテナに組み込まれているため、xmlに書き込まれているわけではないので、activityはfragmentを除去、置換することができます.
2つのfragment間を切り替える方法
fragmentを置き換える過程はaddとよく異なり、違いはreplace()関数であり、add()関数である.常に注意しなければならないのは、fragment操作、例えば、fragmentを置換または削除する場合、ユーザの通常の操作は、バックワードまたはリストア(undo)操作である.ユーザーのこれらの操作をサポートするために、commit()FragmentTransactionの前に関数addToBackStack()関数を呼び出します.
注意:fragmentを削除または置換し、back stack(バックスタック?)にこの操作を挿入すると、fragmentが除去されると、fragmentは停止します(破棄ではありません).ユーザーがロールバックする場合は、スタックからfragmentを取り出して再起動します.back stackが追加されていない場合、削除または置換されると、このfragmentは直接破棄されます.
切り替えfragmentは次のとおりです.
// Create fragment and give it an argument specifying the article it should show
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

addToBackStack()には、FragmentManagerを使用する必要があるオプションのStringパラメータがあります.BackStackEntryクラスのAPIsの場合に使います.
 

Fragment間通信


Fragment UIを再利用するには、このFragmentを独自のlayoutと動作を持つシステムに構築する必要があります.これらの再利用可能なfragmentsを定義すると、activityにバインドして、すべてのアクティブUIを実現することができます.多くの場合、私たちは2つのfragments間で通信したい(例えば、ユーザーの入力に応じて内容を変更したい)と思っています.すべてのFragment間の通信は、彼らが添付したActivityを通じて行われ、彼らの間で直接通信することはできません.Fragmentと彼を含むActivityとの通信を許可するためにインタフェースを定義し、Fragmentクラスでインタフェースを定義し、Activity内で実装することができます.FragmentはonAttach()関数でインタフェース実装をキャプチャし,インタフェースメソッドとActivity通信を呼び出す.△Fragment間はActivityでしか通信できないということです.次のFragmentとActivity通信の例を見てみましょう.
public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        
        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }
    
    ...
}

FragmentはonArticleSelected()関数を使用してActivityにメッセージを渡すことができます.OnHeadlineSelectedListenerのインスタンスを使用して転送の目的を達成します.
たとえば、次の例では、リストの要素をクリックするとfragmentのメソッドが呼び出されます.Fragmentはmcallbackという実例化されたものを用いている.
を選択します.
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Send the event to the host activity
        mCallback.onArticleSelected(position);
    }

実装インタフェース
Fragmentからイベントメッセージを受信するには、親activityがfragmentクラスで定義されたいくつかのインタフェースを実装する必要があります.例は次のとおりです.
public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...
    
    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

Fragmentにメッセージを渡す
ホストActivityは、findFragmentById()関数を使用してFragmentインスタンスを取得し、fragmentsの共有関数にアクセスしてFragmentsにメッセージを渡すことができます.次の例では、ホストクラスは、コールバック関数で取得した情報を、これらのデータを表示する別のFragmentに渡す.
public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article

        ArticleFragment articleFrag = (ArticleFragment)
                getSupportFragmentManager().findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
            // If article frag is available, we're in two-pane layout...

            // Call a method in the ArticleFragment to update its content
            articleFrag.updateArticleView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected article
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);
        
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}

からhttp://blog.csdn.net/murphykwu/article/details/7989961ここで転載します.自分で訳すと思って、ネット上ですでにあったことを発見して、だから転載して、便利な後続の検索!