フラグメントの基本概要


このセクションの概要

さて、前の章では、Android の 4 つの主要コンポーネント (アクティビティ、サービス、ブロードキャストレシーバー、コンテンツプロバイダー) について説明しました。 それらの間の絆だけでなく、意図、私たちは皆それを演じてきました、そしてこの章はあなたに断片をもたらします。 ここではこのFragmentの基本的な概念と使い方を紹介していきます! 公式文書: フラグメント


1. 基本コンセプト

1) それは何で、何に使用されますか?

回答: Fragment は、Android 3.0 以降に導入された新しい API であり、その本来の目的は大画面タブレットに適応することでした。 もちろん、これは依然としてタブレット APP UI デザインの最愛の人であり、通常の携帯電話開発にもこのフラグメントが追加されます。 これは、アクティビティ フラグメントとも呼ばれる小さなアクティビティと考えることができます。考えてみてください。大規模なインターフェイスの場合、 レイアウトが 1 つだけだとインターフェイスを書くのも大変ですし、コンポーネントがたくさんあると管理するのも大変です。フラグメントを使用する代わりに 画面をいくつかの部分に分割し、それらをグループ化してモジュール管理することができます。これにより、さらに便利になります 動作中にアクティビティ ユーザー インターフェイスを動的に更新します。また、Fragment は単独で使用できず、Activity にネストする必要があります。 で使用され、独自のライフサイクルがありますが、アクティビティなどのホストアクティビティのライフサイクルの影響を受けます。 destroyで破壊されると、それも破壊されます!

次の図は、携帯電話とタブレットのさまざまな状況に対応するドキュメント内のフラグメントです:

1.png

PS: 2 つのフラグメントを使用してニュース リストとニュース コンテンツをそれぞれ表示する、単純なニュース閲覧ページです。


2) フラグメントのライフサイクル図

2.jpg


3) コアポイント:

Fragment を使用する際の重要なポイントをいくつか示します:

  • バージョン 3.0 以降に導入されました。つまり、minSdk は 11 より大きい必要があります
  • フラグメントはアクティビティにネストする必要があります。もちろん、別のフラグメントにネストすることもできますが、これはネストされています。 間接的に言えば、フラグメントもアクティビティにネストする必要があります。 ホストアクティビティのライフサイクルの影響を受けます。もちろん、独自のライフサイクルもあります。また、Fragment での使用は推奨されません。 ネストされたフラグメントは、内部にネストされたフラグメントのライフサイクルが制御できないためです!!!
  • 公式ドキュメントによると、フラグメントを作成するときは、少なくとも 3 つのメソッドを実装する必要があります: onCreate( )、onCreateView( )、OnPause( ); ただし、onCreateView は 1 つしか書けないようです...
  • Fragment のライフサイクルは、Activity のライフサイクルに似ています: 3 つの状態:
    Resumed: 許可された Fragment が表示されます
    Paused: アクティビティが表示されます、しかしフォーカスは得られません
    停止しました : ①addToBackStack()を呼び出すとBcakスタックにFragmentが追加されます ②アクティビティがバックグラウンドに移動、またはフラグメントが置換/削除されます
    ps:停止状態のフラグメントはまだ生きています(すべてのステータスとメンバー情報はシステムによって維持されます)が、ユーザーにとって役に立ちません。 これはもう表示されなくなり、アクティビティが強制終了されると、そのアクティビティも強制終了されます

4) Fragment のいくつかのサブクラス:

ps: 多くの場合、Fragment を直接書き換えて、対応するレイアウトをインフレートロードします。 business 、サブクラスはあまり使用されない、必要になるまで待つ

  • ダイアログ:DialogFragment
  • リスト:ListFragment
  • オプション設定:PreferenceFragment
  • WebViewインターフェース:WebViewFragment

5) アプリを使用してダウンロードしますフラグメントはまだ v4 パッケージの下にあります:

問題の概要:

フラグメントを使用するときに多くの友人が次の状況に遭遇すると思います:

3.jpg

そこで、android.app の下でフラグメントを使用する必要があるかどうかandroid.support.v4.app パッケージを使用しますか? フラグメントについてはどうですか?

A: 実際、前述したように、Fragment は Android 3.0 (API 11) 以降に導入されたため、開発されたアプリが必要な場合はすべて可能です。 3.0 より前のバージョンで実行する場合はどうでしょうか? たとえば、2.3 はまだ市場シェアが少ないため、v4 パッケージが登場しました。 そして、最小バージョンはバージョン 1.6 と互換性があります。どのパッケージを使用するかは、すべてニーズ次第です。現在、Suijie は 4.0 以降の携帯電話の市場シェアが非常に小さく、10 月には 6.0 がリリースされます。 .. したがって、現時点では、アプリパッケージの下で直接フラグメントを使用できます 次に、関連するメソッドを呼び出します。フラグメントがアプリ パッケージを使用している場合、通常は問題ありません。 FragmentManager と FragmentTransaction の両方がアプリ パッケージに含まれている必要があります。すべてにアプリを使用するか、すべてに v4 を使用します。 それ以外の場合は、エラーが報告されます。もちろん、アプリを以前のバージョンの携帯電話と互換性を持たせたい場合は、v4 パッケージの使用を選択できます。

v4 パッケージを使用してフラグメントをダウンロードする際の注意点:

  • ① v4 パッケージで Fragment を使用する場合、使用しているアクティビティは FragmentActivity を継承する必要があります。 ケース: 今日、xml ファイル内のフラグメントを静的にロードし、その後フラグメントを書き換えましたが、アクティビティのロード時にエラーが報告されました。 一般的なヒントは、フラグメントエラーがまだ見つからないか、名前属性が何度も変更されているのに、まだ間違っていることがわかりました。 v4 パッケージなので、Activity を FragmentActivity に変更するだけです。
  • ②以前に次のコードを書いて、エラーを報告しました:

4.jpg

これは少し不可解です、Fragment、FragmentManager、および FragmentTransactionすべて v4 パッケージを使用します。 Activity も FragmentActivity を継承しますか? アプリ パッケージに変更するだけですが、これは使用する v4 パッケージとは異なります。 前提に矛盾はありますか? 実際、解決策はありますか?
答え: getFragmentManager( ) を getSupportFragmentManager( ) に変更するだけです


1) フラグメントを静的にロードします

実装プロセス:

5.pngサンプルコード:

ステップ1:

フラグメントのコンテンツの表示方法であるフラグメントのレイアウトを定義します

ステップ2:フラグメントクラスをカスタマイズします。フラグメントまたはそのサブクラスを継承する必要があるため、onCreateView() メソッドをオーバーライドします このメソッドでは、 inflater.inflate() メソッドを呼び出して Fragment のレイアウト ファイルをロードし、ロードされたビュー オブジェクトを返します
public class Fragmentone extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroupcontainer ,
バンドル SavedInstanceState ) {
」”、誰が、誰が、誰が、誰が、誰が、誰が、誰が、誰が、誰のアクティビティが読み込まれています。 = “inflater.inflate(R.layout.fragment1、container、false) のタグ、 name 属性は完全修飾クラス名であることに注意してください。つまり、


<fragment
android:id="@+id/fragment1"
android:name= のように、フラグメントのパッケージ名を含める必要があります。 "com.jay.example.fragmentdemo.Fragmentone"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />

ステップ 4: アクティビティは onCreate() メソッドで setContentView() を呼び出してレイアウト ファイルを読み込みます


2) Fragment を動的にロードします

実装プロセス:

7.png

: ここで示しているのは、水平画面と垂直画面を切り替えるときに Fragment を切り替えることです:

6.gif

MainActivity のキーコードを直接貼り付けます:

public class MainActivity extends Activity {

@Override
プロテクションvoid oncreate(bundle savedinstancestate){
super.oncreate(savedinstancestate); Fragment2();
getFragmentManager().beginTransaction().replace(R.id.LinearLayout1, f2).commit();

3.Fragment管理とFragment事情

8.png


4.FragmentとActivityの相互作用

9.png

写真を見るのが苦手な友達もいるかもしれないので、言葉で紹介しましょう:

1)コンポーネントの取得

Fragment は、Activity のコンポーネントを取得します: getActivity().findViewById(R.id.list);
Activity は、Fragment のコンポーネントを取得します (ID とタグの両方に従って): getFragmentManager.findFragmentByid(R.id.フラグメント1 );


2) データ転送

①ActivitがFragmentにデータを渡す:

Activity内にBundleデータパッケージを作成し、FragmentインスタンスのsetArguments(bundle)を呼び出す したがって、バンドル データ パケットはフラグメントに渡され、フラグメント内で getArguments が呼び出されて取得されます。 オブジェクトをバンドルして解析します

②FragmentがActivityにデータを渡します

Fragmentに内部コールバックインターフェースを定義し、Fragmentを含むActivityにコールバックインターフェースを実装させ、 Fragment は Callback インターフェイスを介してデータを転送できます。それが何であるかは多くの人が知っていると思いますが、 インターネット上の「フラグメントがアクティビティにデータを転送する」というコードはすべて Li Gang 先生が書いたもので、本当に言葉を失います。 忘れてください。コードの一部をここに書き留めておきます。読者は一目で理解できると思います:

ステップ 1: コールバック インターフェイスを定義します: (フラグメント内)

/*interface*/
public インターフェイスCallBack{
/*情報を取得するメソッドを定義します*/
public void getResult(String result)
}

ステップ 2: インターフェイス コールバック (フラグメント内)

/*インターフェイス コールバック*/
public void getData( CallBack callBack){
/*テキスト ボックスの情報を取得します。もちろん、必要に応じて他の種類のパラメータを渡すこともできます*/
String msg = editText.getText().toString();
callBack .getResult(msg);次のステップ 3: インターフェイス コールバック メソッドを使用してデータを読み取ります (アクティビティ内)

/*インターフェイス コールバック メソッドを使用してデータを取得します*/
Leftfragment.getdata (new callback () {
@Override
public void Getresult (文字列結果) {


Fragment でインターフェイスを定義し、インターフェイスで抽象メソッドを定義し、渡したいデータパラメータのタイプ

->
次に、インターフェースを呼び出す抽象メソッドを記述し、渡したいデータパラメータを設定します。渡されたデータは

->に渡され、次にFragmentが提供するメソッドを呼び出し、データを処理します。抽象メソッドをオーバーライドします。 読んでください!!!③FragmentとFragmentの間のデータ転送

実際、これはデータを受け入れる必要があるフラグメントオブジェクトを見つけて、setArgumentsを直接呼び出してデータを渡すだけです。 通常、置き換える場合、つまりフラグメントがジャンプするときにデータが転送される場合、ジャンプするフラグメントを初期化するだけで済みます。 次に、setArguments メソッドを呼び出してデータを渡します。 2 つのフラグメントがジャンプする代わりにすぐにデータを送信する必要がある場合は、最初にアクティビティの f1 によって渡されたデータを取得する必要があります。 次に、Activity を媒体として f2 に渡します~

サンプルコードは次のとおりです:

FragmentManager fManager = getSupportFragmentManager();
FragmentTransaction fTransaction = fManager.beginTransaction();

Fragmentthree t1 = new Fragment three();
Fragmenttwo t2 = new Fragmenttwo();

バンドル バンドル = new Bundle();bundle.putString("key",id);t2.setArguments(バンドル); .fragmentRoot, t2 , "~~~");

fTransaction.addToBackStack(t1);

5. ライフ サイクル図を見てみましょう:

よく考えた結果、Fragment のライフ サイクルについての理解を深めるために、簡単なライフ サイクル図を見てみることにしました:

①アクティビティが Fragment をロードするときに、以下のメソッドを順に実行します:onAttach -> onCreate -> onStart ->onResume②スタイル アクティビティ、または他のもの、ただフラグメントが配置されているアクティビティを表示しますが、フォーカスは取得しませんonPause

③ダイアログボックスが閉じられると、アクティビティは再びフォーカスを取得します:

onResume

④フラグメントを置き換えてaddToBackStack()を呼び出すと、バックスタックに追加します

onPause -> onStop -> onDestoryView! ! 注意

、この時点ではフラグメントはまだ破棄されていません!!!

⑤キーボードの戻るキーを押すと、フラグメントが再度表示されます。 ⑥置換後、トランザクションコミット前にaddToBackStack()

メソッドが呼び出されていない場合

フラグメントがバックスタックに追加されるか、アクティビティが終了すると、フラグメントは完全に終了します。 フラグメントは破壊状態になります onPause ->

onStop

-> onDestory -> onDetach ご説明させていただきました以下に、Fragment の基本的な概念と簡単な使用法を示します。誰もが徐々に Fragment に夢中になると思います。 フラグメントについては、スペースの都合上、このセクションではこれだけ書きます。次のセクションでは、フラグメントについて少し書きます。 よく使用される例、楽しみにしていてください、ありがとう~