Android 入門チュートリアル | フラグメントの基本概念

ここに画像の説明を挿入

フラグメントとは何ですか?

フラグメント、直訳すると「断片」、「断片」。Fragment は、FragmentActivity の動作またはインターフェイスの一部を表します。1 つのアクティビティで複数のフラグメントを結合してマルチペイン インターフェイスを構築し、複数のアクティビティでフラグメントを再利用できます。フラグメントは、独自のライフサイクルを持ち、独自の入力イベントを受け取り、アクティビティの実行中に追加または削除できるアクティビティのモジュール式コンポーネントと考えることができます (「子アクティビティ」に似ています)。

フラグメントは常にアクティビティ内でホストされる必要があり、フラグメントのライフサイクルはホスト アクティビティのライフサイクルに直接影響されます。たとえば、アクティビティが一時停止されると、アクティビティのすべてのフラグメントも一時停止され、アクティビティが破棄されると、すべてのフラグメントも破棄されます。

ただし、アクティビティの実行中 (ライフサイクルが再開された状態)、フラグメントの追加や削除など、各フラグメントを個別に操作できます。このようなフラグメント トランザクションが実行されると、アクティビティによって管理されるバック スタックにも追加されます。アクティビティ内の各バック スタック エントリは、フラグメント トランザクションが発生したことを示すレコードです。バック スタックを使用すると、ユーザーは [戻る] ボタンを押してフラグメント トランザクションを元に戻す (戻る) ことができます。

フラグメントの利点

  • フラグメントのロードは柔軟で、交換も簡単です。UI をカスタマイズし、さまざまなサイズの画面に適切な UI を作成し、ユーザー エクスペリエンスを向上させます。
  • 再利用可能なページ レイアウトでは複数のフラグメントを使用でき、異なるコントロールやコンテンツを異なるフラグメントに分散できます。
  • フラグメントを使用すると、使用するアクティビティを減らすことができます。アクティビティは複数のフラグメントを管理できます。

フラグメントのライフサイクル

画像

Fragment クラスのコードは、Activity と非常によく似ています。これには、onCreate()、onStart()、onPause()、onStop() などの、Activity に似たコールバック メソッドが含まれています。実際、フラグメントを使用するように既存の Android アプリを変換する場合は、コードをアクティビティのコールバック メソッドからフラグメントの対応するコールバック メソッドに移動するだけで済む場合があります。

通常、少なくとも次のライフサイクル メソッドを実装する必要があります

  • onCreate() システムは、フラグメントの作成時にこのメソッドを呼び出します。フラグメントを一時停止または停止してから再開した後、フラグメントの基本コンポーネントを保持したい場合は、実装内でフラグメントを初期化する必要があります。
  • onCreateView() フラグメントが初めてインターフェイスを描画するときに、システムはこのメソッドを呼び出します。フラグメントのインターフェイスを描画するには、このメソッドから返される View がフラグメントのレイアウトのルート ビューである必要があります。フラグメントがインターフェイスを提供しない場合は、null を返す可能性があります。
  • onPause() システムは、ユーザーがフラグメントを離れる最初の信号としてこのメ​​ソッドを呼び出します (ただし、必ずしもフラグメントが破棄されることを意味するわけではありません)。一般に、現在のユーザー セッションが終了した後も存続する変更は (ユーザーが戻らない可能性があるため)、このメソッド内で承認される必要があります。

Fragment 基本クラス以外のいくつかのサブクラスを拡張することもできます

  • DialogFragment はフローティング ダイアログを表示します。このクラスを使用してダイアログを作成することは、Activity クラスでダイアログ ヘルパー メソッドを使用する代わりの効果的な方法です。アクティビティによって管理されるフラグメント バック スタックにフラグメント ダイアログを配置できるため、ユーザーはクリアされたフラグメントに戻ることができます。
  • ListFragment は、ListActivity と同様に、SimpleCursorAdapter などのアダプターによって管理される項目のコレクションを表示します。このクラスは、クリック イベントを処理するための onListItemClick() コールバックなど、リスト ビューを管理するためのメソッドをいくつか提供します。(リストを表示する推奨される方法は、ListView ではなく、RecyclerView を使用することです。この場合、リスト レイアウトに RecyclerView を含むフラグメントを作成します。方法については、「RecyclerView を使用したリストの作成」を参照してください。)
  • PreferenceFragmentCompat は、Preference オブジェクトの階層をリスト形式で表示します。アプリケーションの設定画面を作成するクラスです。
フラグメントを作成し、カスタムインターフェイスを使用します

フラグメントは通常、アクティビティのインターフェイスの一部として使用され、独自のレイアウトをアクティビティに組み込みます。

フラグメントにレイアウトを提供するには、onCreateView()フラグメントがレイアウトを描画する必要があるときに Android システムが呼び出すコールバック メソッドを実装する必要があります。このメソッドの実装によって返されるビューは、フラグメント レイアウトのルート ビューである必要があります。

onCreateView() からレイアウトを返すには、XML で定義されたレイアウト リソースによってレイアウトを拡張できます。これを支援するために、onCreateView() は LayoutInflater オブジェクトを提供します。

たとえば、次の Fragment サブクラスはexample_fragment.xmlファイルからレイアウトを読み込みます。

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

渡されるコンテナー パラメーターonCreateView()は、フラグメントのレイアウトが挿入される (アクティビティのレイアウトからの) 親 ViewGroup です。SavedInstanceState パラメータは、フラグメントが復元されるときに前のフラグメント インスタンスに関連するデータを提供するバンドルです (フラグメントのライフ サイクルを扱うセクションで復元状態について詳しく説明します)。

inflate() メソッドは 3 つのパラメータを取ります

  • 拡張するレイアウトのリソース ID。
  • 拡張レイアウトの親となる ViewGroup。コンテナを渡すことには、システムが拡張レイアウトのルート ビュー (コンテナが属する親ビューによって指定される) にレイアウト パラメータを適用するという意味があります。
  • 展開時に展開されたレイアウトを ViewGroup (2 番目のパラメータ) にアタッチする必要があるかどうかを示すブール値。(この場合、システムはすでに展開されたレイアウトをコンテナに挿入しており、値 true を渡すと、最終レイアウトに冗長なビューグループが作成されるため、値は false です。)

次に、このフラグメントをアクティビティに追加する必要があります。

アクティビティにフラグメントを追加

通常、フラグメントはホスト アクティビティへのインターフェイスの一部を提供し、アクティビティの全体的なビュー階層の一部としてアクティビティに埋め込まれます。アクティビティ レイアウトにフラグメントを追加するには 2 つの方法があります (以下のコード スニペットは完全ではありません)。

静的な方法

アクティビティのレイアウト ファイル内でフラグメントを宣言します。この場合、フラグメントがビューであるかのように、フラグメントのレイアウト プロパティを指定できます。たとえば、2 つのフラグメントを含むアクティビティのレイアウト ファイルは次のとおりです。

<?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.example.news.ArticleListFragment"
            android:id="@+id/list"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
    <fragment android:name="com.example.news.ArticleReaderFragment"
            android:id="@+id/viewer"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
</LinearLayout>

<fragment>の属性はandroid:name、レイアウト内でインスタンス化する Fragment クラスを指定します。

このアクティビティ レイアウトが作成されると、システムはレイアウトで指定された各フラグメントをインスタンス化し、onCreateView()各フラグメントのメソッドを呼び出して各フラグメントのレイアウトを取得します。フラグメントによって返されたビューは、<fragment>要素の代わりに直接挿入されます。

注: 各フラグメントには、アクティビティの再開時にフラグメントを復元する (または、削除などの特定のトランザクションを実行するためにフラグメントをキャプチャする) ためにシステムが使用できる一意の識別子が必要です。フラグメントの ID を指定するには 2 つの方法があります。 android:id 属性に一意の ID を指定します。android:tag 属性に一意の文字列を指定します。

Javaコードロードフラグメント

あるいは、プログラムによってフラグメントを既存の ViewGroup に追加します。アクティビティの実行中はいつでも、アクティビティ レイアウトにフラグメントを追加できます。フラグメントを配置する ViewGroup を指定するだけです。

アクティビティでフラグメント トランザクション (フラグメントの追加、削除、置換など) を実行するには、FragmentTransaction の API を使用する必要があります。FragmentTransaction インスタンスは、次のように FragmentActivity から取得できます。

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

次に、add()メソッドを使用してフラグメントを追加し、追加するフラグメントとそれを挿入するビューを指定します。例えば:

ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();

渡される最初のパラメータadd()は、リソース ID で指定されたフラグメントを配置する ViewGroup で、2 番目のパラメータは追加するフラグメントです。FragmentTransaction 経由で変更を行った後、commit()変更を有効にするために を呼び出す必要があります。

フラグメントの管理

アクティビティ内のフラグメントを管理するには、FragmentManager を使用する必要があります。これを取得するには、 Activity から呼び出しますgetSupportFragmentManager()

FragmentManager を使用して実行できる操作は次のとおりです

  • (アクティビティ レイアウトでインターフェイスを提供するフラグメントの場合) または findFragmentByTag() (インターフェイスを提供するフラグメントまたは提供しないフラグメントの場合) を介して、アクティビティに存在するfindFragmentById()フラグメントを取得します。
  • (ユーザーが発行したリターンコマンドをシミュレートして)popBackStack()バックスタックからフラグメントをポップします。
  • を介してaddOnBackStackChangedListener()リターンスタックへの変更のリスナーを登録します。

FragmentManager を使用して FragmentTransaction を開くこともでき、これを通じてフラグメントの追加や削除などの特定のトランザクションを実行できます。

フラグメントトランザクションの実行

アクティビティでフラグメントを使用することの優れた点の 1 つは、ユーザーの操作に応じてフラグメントを追加、削除、置換、その他の操作を実行できることです。アクティビティにコミットされた変更の各セットはトランザクションと呼ばれ、FragmentTransaction の API を使用してトランザクションを実行できます。各トランザクションは、アクティビティによって管理されるバックスタックに保存することもできるため、ユーザーはフラグメントの変更をロールバックできます (アクティビティのロールバックと同様)。

FragmentTransaction インスタンスは、次のように FragmentManager から取得できます。

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

各トランザクションは、同時に実行する一連の変更です。add()、remove()、replace() などのメソッドを使用して、特定のトランザクションに対して実行するすべての変更を設定できます。次に、トランザクションをアクティビティに適用するには、commit() を呼び出す必要があります。

ただし、commit() を呼び出す前に、addToBackStack() を呼び出して、トランザクションをフラグメント トランザクション バック スタックに追加することもできます。このバックスタックはアクティビティによって管理され、ユーザーは戻るボタンを押すことで前のフラグメント状態に戻ることができます。

たとえば、次の例は、あるフラグメントを別のフラグメントに置き換えて、バック スタックに以前の状態を保存する方法を示しています。

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

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

// Commit the transaction
transaction.commit();

この場合、newFragment は、 R.id.fragment_container ID で識別されるレイアウトコンテナー内に現在存在するフラグメント (存在する場合)を置き換えます。addToBackStack() を呼び出すと、置換トランザクションをバック スタックに保存できるため、ユーザーは [戻る] ボタンを押してトランザクションを元に戻し、前のフラグメントにロールバックできます。

次に、FragmentActivity は onBackPressed() を介してバックスタックからフラグメントを自動的に取得します。

トランザクションに複数の変更 (さらに別の add() や Remove() など) を追加して addToBackStack() を呼び出すと、commit() を呼び出す前に適用されたすべての変更が単一のトランザクションとしてバックスタックに追加され、戻るボタンを押すとすべて元に戻ります。

ただし、FragmentTransaction に変更を追加する順序は重要ではありません。

commit() は最後に呼び出す必要があります。複数のフラグメントを同じコンテナに追加する場合、フラグメントを追加する順序によって、ビュー階層に表示される順序が決まります。フラグメントを削除するトランザクション中に addToBackStack() が呼び出されない場合、フラグメントはトランザクションのコミット時に破棄され、ユーザーはフラグメントにロールバックできなくなります。ただし、フラグメントの削除中に addToBackStack() が呼び出された場合、システムはフラグメントを停止し、ユーザーが戻るとフラグメントを再開します。

commit() を呼び出してもトランザクションはすぐには実行されませんが、アクティビティの UI スレッド (「メイン」スレッド) が利用可能になったときにスレッド上でトランザクションが実行されるようにスケジュールされます。ただし、必要に応じて、executePendingTransactions() を UI スレッドから呼び出して、commit() でコミットされたトランザクションを即座に実行することもできます。通常、他のスレッドのジョブがトランザクションに依存しない限り、これを行う必要はありません。

注: commit() を使用してトランザクションをコミットできるのは、アクティビティがその状態を保存する前 (ユーザーがアクティビティを離れるとき) のみです。それ以降にコミットしようとすると、例外がスローされます。これは、アクティビティを再開する必要がある場合に、送信された状態が失われる可能性があるためです。コミットの欠落が問題にならない場合は、 を使用しますcommitAllowingStateLoss()

ライフサイクルの変化

フラグメント作成時

以下の状態を経ます

onAttach()
onCreate()
onCreateView()
onActivityCreated()

フラグメントがユーザーに表示されるとき

以下の状態を経ます

onStart()
onResume()

フラグメントが「バックグラウンド モード」になったとき

以下の状態を経ます

onPause()
onStop()

フラグメントが破棄される (またはフラグメントを保持するアクティビティが破棄される)

以下の状態を経ます

onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()

フラグメントとアクティビティ間の異なるライフサイクル

Fragment の状態のほとんどは Activity と似ていますが、Fragment にはいくつかの新しい状態があります。

フラグメントはアクティビティのライフサイクルとは異なります

  • onAttached()—— フラグメントがアクティビティに追加されたときに呼び出されます (このメソッドでは、フラグメントが配置されているアクティビティを取得できます)。
  • onCreateView()—— アクティビティがフラグメントのレイアウトを取得したい場合、このメソッドが呼び出され、フラグメントはその中に独自のレイアウト (インターフェイス) を作成します。
  • onActivityCreated()—— このメソッドは、アクティビティの onCreated() メソッドが返された後に呼び出されます。
  • onDestroyView()- このメソッドは、フラグメント内のビューが削除されるときに呼び出されます。
  • onDetach()—— このメソッドは、フラグメントとアクティビティが分離されるときに呼び出されます。

アクティビティが再開状態 (つまり、実行状態) になると、フラグメントを自由に追加および削除できます。したがって、アクティビティが再開状態にある場合にのみ、フラグメントのライフ サイクルは独立して実行でき、それ以外の場合はアクティビティのライフ サイクルの変更に依存します。

フラグメントのライフサイクルを処理する

フラグメントのライフサイクルの管理は、アクティビティのライフサイクルの管理と非常に似ています。アクティビティと同様、フラグメントには 3 つの状態が存在します。

  • 復元済み: フラグメントは実行中のアクティビティに表示されます。
  • 一時停止: 別のアクティビティがフォアグラウンドにあり、フォーカスがありますが、このフラグメントが存在するアクティビティはまだ表示されています (フォアグラウンドのアクティビティは部分的に透明であるか、画面全体をカバーしていません)。
  • 停止: フラグメントは表示されません。ホストのアクティビティが停止したか、フラグメントがアクティビティから削除されましたが、バックスタックに追加されました。停止したフラグメントはまだアクティブです (すべての状態とメンバーシップ情報は保持されます)。ただし、ユーザーには表示されなくなり、アクティビティの終了とともに終了します。アクティビティと同様に、onSaveInstanceState(Bundle)、ViewModel、永続ローカル ストレージを組み合わせて使用​​して、構成変更やプロセス終了後もフラグメントの UI 状態を保持することもできます。UI 状態の保存の詳細については、「UI 状態の保存」を参照してください。

アクティビティ ライフ サイクルとフラグメント ライフ サイクルの場合、この 2 つの最も重要な違いは、それぞれのリターン スタックの格納方法です。デフォルトでは、アクティビティが停止すると、システム管理のアクティビティ バック スタックに配置されます。ただし、システムは、フラグメントを削除したトランザクション中に addToBackStack() を呼び出してインスタンスの保存が明示的に要求された場合にのみ、ホスト アクティビティによって管理されるバック スタックにフラグメントを配置します。

他の点では、フラグメントのライフサイクルの管理はアクティビティのライフサイクルの管理と非常に似ており、ここでも同じアプローチを採用できます。

画像

注: フラグメントに Context オブジェクトが必要な場合は、getContext() を呼び出すことができます。ただし、 getContext() を呼び出す必要があるのは、フラグメントがアクティビティにアタッチされている場合のみであることに注意してください。フラグメントがアタッチされていない場合、またはライフタイムの終了時にデタッチされた場合、getContext() は null を返します。

フラグメント関連のインタビューの質問:

1. フラグメントの切り替え方法(再インスタンス化なし)

Android の公式ドキュメントといくつかのコンポーネントのソース コードを調べてみると、replace() メソッドは、以前のフラグメントが不要になった場合に便利なメソッドであることがわかりました。

正しい切り替え方法は、切り替え時に add()、hide()、別のフラグメントを add() することです。再度切り替える場合は、現在のフラグメントを Hide() し、もう一方のフラグメントを show() するだけです。このようにして、再インスタンス化せずに複数のフラグメント切り替えを実現できます。

2. フラグメントのメリット

  • フラグメントを使用すると、アクティビティを複数の再利用可能なコンポーネントに分割でき、それぞれが独自のライフサイクルと UI を持ちます。
  • フラグメントを使用すると、さまざまな画面サイズに適応できる動的で柔軟な UI デザインを簡単に作成できます。携帯電話からタブレットへ。
  • フラグメントは独立したモジュールであり、アクティビティと緊密に結合されています。運用中に動的に削除、追加、交換などが可能です。
  • フラグメントは、さまざまな Android デバイス間で UI を統合する新しい方法を提供します。
  • Fragment は、アクティビティ間のスムーズでない切り替えと軽量な切り替えの問題を解決します。
  • Fragment はナビゲーション用の TabActivity を置き換え、パフォーマンスが向上しました。
  • Fragment は、バージョン 4.2 でネストされたフラグメントの使用方法を追加し、より良いインターフェイス効果を生成できます。

3. Fragment は、Activity スタックと同様のプッシュおよびポップ効果をどのように実現しますか

Fragment の Thing Manager は内部で二重リンクのリスト構造を維持しており、毎回追加および置換する Fragment を記録でき、戻るボタンをクリックすると自動的にアンスタック操作を実現します。

4. Fragmentのreplaceメソッドとaddメソッドの違い

Fragment 自体には replace メソッドと add メソッドがありませんが、FragmentManager の replace メソッドと add メソッドを使用して Fragment を切り替えることの違いを理解してください。

私たちがよく使用するアーキテクチャの 1 つは、RadioGroup を介してフラグメントを切り替えることであり、各フラグメントは機能モジュールです。

Fragment のコンテナは FrameLayout です。追加するときは、すべての Fragment が FrameLayout 上に 1 層ずつ重ねられます。置き換えるときは、まずコンテナ内の他の Fragment を削除してから、現在の Fragment をコンテナに追加します。

Fragmentコンテナに追加できるFragmentは1種類のみで、複数回追加すると例外が報告されてプログラムが終了しますが、replaceの場合は問題なく、任意に切り替えてください。

add メソッドで追加された各 Fragment は 1 回しか追加できないため、切り替え効果を実現したい場合は、Fragment の非表示メソッドと表示メソッドを組み合わせて使用​​する必要があります。表示するものを表示し、その他を非表示にします。このプロセスでは、フラグメントのライフサイクルは変更されていません。replace によって Fragment を切り替えると、前の Fragment の onDestroyView と、新しい Fragment の onCreateView、onStart、および onResume メソッドが毎回実行されます。

上記のさまざまな特性に基づいて、ビューとデータを操作するには、使用する用途をライフサイクルと組み合わせる必要があります。

5. FragmentとActivityの間で値を渡す方法

  • アクティビティはフラグメントに値を渡します。

バンドルオブジェクトに渡す値を入れる; アクティビティでFragmentのフラグメントオブジェクトfragmentを作成し、fragment.setArguments()を呼び出してフラグメントに渡す; FragmentのgetArguments()を呼び出してバンドルオブジェクトを取得するそして内部の値を取得できます。

  • フラグメントは値をアクティビティに渡します。

Activity で getFragmentManager() を呼び出して、fragmentManager を取得するか、findFragmentByTag(tag) を呼び出すか、findFragmentById(id) を渡します。

コールバックを通じて、インターフェイスを定義します (Fragment クラスで定義できます)。インターフェイスには空のメソッドがあり、フラグメント内で必要に応じてインターフェイスのメソッドが呼び出されます。値はこのメソッドにパラメーターとして配置できます。次に、アクティビティに実装させます。このインターフェイスは必然的にこのメソッドを書き換えて、値がアクティビティに渡されるようにします。

6. フラグメントのライフサイクル

  • onAttach(Contextcontext): フラグメントとアクティビティが関連付けられているときに呼び出され、一度だけ呼び出されます。このコールバックでは、コンテキストをアクティビティに変換して保存できます。これにより、後でアクティビティを取得するために getAtivity() を頻繁に呼び出す状況を回避し、場合によっては getAtivity() が空であるという例外を回避します (アクティビティとフラグメントは分離されています)。同時に、受信した引数もコールバックで抽出して解析することができます。アプリケーションがシステムによってリサイクルされるときに Fragment は関連するプロパティを保存しないため、setArguments を介して Fragment にパラメータを渡すことを強くお勧めします。
  • onCreate: これは、アクティビティの onCreate と同様に、フラグメントが最初に作成されるときに呼び出されます。
  • View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState): Fragment インターフェイスを描画する準備ができたときに呼び出され、戻り値はレイアウトを描画するための Fragment のルート ビューです。もちろん、null を返すこともできます。インフレータを使用してビューを構築する場合は、attachToRoot を false に指定する必要があることに注意してください。これは、Fragment が自動的にビューをコンテナに追加し、true の場合はattachToRoot が繰り返しエラーを追加するためです。onCreateView は必ずしも呼び出されるわけではありません。FragmentTransaction の add(Fragment flagment, String tag) メソッドを呼び出すなど、インターフェイスなしで Fragment を追加する場合には呼び出されません。
  • onActivityCreated: アクティビティの onCreated が実行されるときに呼び出されます。
  • onStart(): アクティビティが開始されている場合に、フラグメントがユーザーに表示されるときに呼び出されます。
  • onResume(): アクティビティが再開された場合、フラグメントとユーザーが以前に対話できるときに呼び出されます。
  • onPause(): フラグメントとユーザーが以前に相互作用できなかった場合に呼び出されます。
  • onStop(): フラグメントが表示されていないときに呼び出されます。
  • onDestroyView(): フラグメント関連のビュー階層が削除されるときに呼び出されます。
  • onDestroy(): Fragment 状態が最終的にクリアされるときに呼び出されます。
  • onDetach(): フラグメントとアクティビティの関連付けが解除されるときに呼び出されます。

7. ViewPager がフラグメントのライフサイクルに与える影響

ViewPager+Fragment は比較的一般的な組み合わせで、通常は ViewPager の FragmentPagerAdapter または FragmentStatePagerAdapter とともに使用されます。ただし、ViewPager にはスライドのフリーズを防ぐためのキャッシュ機構があり、デフォルトでは ViewPager は現在のページの左側と右側にページ (Fragments など) を作成してキャッシュします。このとき、左右のFragmentはonAttach->….->onResumeというライフサイクルを実行することになり、当然Fragmentは表示されていないのにonResumeまで到達しているため、場合によっては問題が発生します。たとえば、データをロードするタイミングや、Fragment が表示されるかどうかの判断などです。

最後のシェア

[Tencent 技術チーム制作] Android ゼロベース入門、Android Studio インストール チュートリアル + Android 基本チュートリアルのフルセット

Android プログラミング チュートリアル

入門から慣れるまでの Java 言語の基礎

ここに画像の説明を挿入

Kotlin 言語の基礎から入門まで

ここに画像の説明を挿入

初心者から使い慣れたものまでの Android テクノロジースタック

ここに画像の説明を挿入

Android Jetpack ファミリー バケットの包括的な学習

ここに画像の説明を挿入

初心者にとって Android Studio のインストールは難しいかもしれません。次のビデオを見て、インストールと実行を段階的に学習してください。

Android Studioのインストールチュートリアル

ここに画像の説明を挿入

Java 段階の学習では、この段階ではビデオ学習に重点を置き、抜け漏れがないか確認するために書籍で補うことをお勧めします。書籍に焦点を当てている場合は、書籍の説明に基づいてコードを入力し、指導ビデオで補足して抜け漏れがないか確認することができます。問題が発生した場合は、Baidu にアクセスしてください。通常、多くの人は使い始めるときに問題に遭遇しますが、その方がより良い回答が得られます。

4大コンポーネントの使い方、Serviceの作成方法、レイアウト方法、簡単なカスタムView、アニメーション、ネットワーク通信などの共通技術などの基礎知識を習得する必要があります。

ゼロベースのチュートリアルの完全なセットが用意されています。必要な場合は、以下の QR コードを追加して無料で入手できます。

Android の基本チュートリアルの完全なセット

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Android23333/article/details/132467377