Android Fragmentについて


Fragmentのデザイン哲学
Androidが最初にタグを導入したのはAndroid 3.0(APIレベル11)から.デフォルトでは、タブレットなど、よりダイナミックで柔軟なUI設計をサポートすることを目標としています.

例えば、ニュースアプリケーションの場合、A原稿は左側に文章リストを表示し、B原稿は右側に文章内容を表示することができる.画面の大きいタブレットでは、リストとコンテンツを1つのアクティビティで同時に表示できますが、モバイルデバイスでは、各アクティビティにAとBタグを表示できます.
分割とは?
アプリケーションUIの再利用可能な部分を分割します.分割は、独自のレイアウトを定義し、管理し、独自のライフサイクルを持ち、独自の入力イベントを処理します.分割は単独では存在せず、アクティブまたは他の分割によって管理される必要があります.分割されたビュー階層は、ホストビュー階層の一部であってもよいし、ホストに接続してもよい.
ここで重要なキーワードは재사용자체 수명 주기단독으로 존재 불가FragmentはAndroid Jetpackライブラリのナビゲーション、BottomNavigationView、View Pager 2と組み合わせて使用されます.
分割の作成
  • 勾配設定
  • 	dependencies {
    	    def fragment_version = "1.4.1"
    	
    	    // Java language implementation
    	    implementation "androidx.fragment:fragment:$fragment_version"
    	    // Kotlin
    	    implementation "androidx.fragment:fragment-ktx:$fragment_version"
    	}
  • 分割クラス
  • を作成する
    	public Fragment() {
            initLifecycle();
        }
        
        @ContentView
        public Fragment(@LayoutRes int contentLayoutId) {
            this();
            mContentLayoutId = contentLayoutId;
        }
               Fragment 생성자는 위처럼 2가지가 있습니다.
    	class AFragment: Fragment() { }
        class AFragment: Fragment(R.layout.fr_a) { }
    継承を使用して簡単な原稿を作成し、2番目のジェネレータレイアウトidを使用して原稿を作成できます.onCreateViewを上書きすることなくUIを構成できます.
    アクティビティに追加
     前述したようにFragmnetは単独では存在しない.したがって、FragmentはFragmentActivityに含める必要があります.デフォルトでは、プロジェクトの作成時にAppCompatActivityとして作成され、AppCompatActivityはFragmentActivityを継承しているため、すぐに使用できます.
     AppCompatActivityは、Activityを最終的に継承し、サブバージョンと互換性のあるクラスです.
    AppCompatActivityについては、ここです。を参照してください.Activity xml에 FragmentContainerView를 추가해 줍니다.
    <androidx.fragment.app.FragmentContainerView
       	 android:id="@+id/fragment_container_view"
       	 android:name="com.example.test.AFragment"
       	 android:tag="AFragment"
       	 android:layout_width="match_parent"
       	 android:layout_height="match_parent" />

  • FragmentContainerView
     FragmentContainerViewは、FrameLayoutで動的計画を作成する新しい方法です.FragmentContainerViewはFrameLayoutを継承し、計画のz順序処理を改善した.
     たとえば、2つのエンティティ間の[終了](Exit)遷移と[イン](In)遷移は重複しません.逆に、このFragmentContainerViewは、まず終了アニメーションを開始し、次に起動アニメーションを開始します.
    https://youtu.be/RS1IACnZLy4?t=548
  • 주의점ID属性を追加せずにname属性にFragmentを追加すると、
    🔴 FragmentContainerView must have an android:id to add Fragment...タグを追加するにはid属性が必要であることを誤って示します.
    name使用時はandroid:id 속성 필수!
  • 構文で追加
    FragmentContainerViewのnameに
  • で説明したようにタグを明示的に追加できますが、プログラミングによってタグを動的に追加することもできます.
  • FragmentContainerViewはname属性を保持して削除します.
  • class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            if (savedInstanceState == null) {
                supportFragmentManager.commit {
                    setReorderingAllowed(true)
                    add<AFragment>(R.id.fragment_container_view)
                }
            }
        }
    }

  • ActivityのonCreateから중요! savedInstanceState가 null일때 FragmentManagerをインポートし、FragmentTransactionのAddを使用してコンテナIDにタグを追加できます.

  • savedInstancesStateがnullの条件文に接頭辞を追加する理由

  • アクティビティがシステムまたはスクリーンで回転して再生されると、savedInstance Stateはnullではないため、少し不注意で중복 생성になります.

  • アクティビティのライフサイクルでは、onPause()->onStop()->onSavedInstancesState()の順に呼び出し、別のアクティビティに移動し、バックグラウンドで画面を移動したり、画面を回転したりすると、onSavedInstancesState()が呼び出されますが、ユーザが明示的に後で後退または完了()関数を終了してアクティビティが終了した場合は呼び出されません.Activity Lifecycle
  • onSavedInstanceState()の使用時期
    画面再生時に表示されるデータを保持するために、簡単で簡単なUIステータスを保存します.
    onSavedInstanceState()はデータをディスクにシリアル化するため、저장용량 및 속도에 의해 제한됩니다.のオブジェクトをシリアル化する場合は、シリアル化に多くのメモリが消費される可能性があります.シリアル化プロセスは、構成の変更時にプライマリ・スレッドで発生するため、シリアル化が長期にわたって実行されると、フレームダウンとビジュアルブレークが発生する可能性があります.비트맵과 같은 대량의 데이터, 또는 길이가 긴 직렬화나 역직렬화가 필요한 복잡한 데이터 구조를 저장하는 데 onSavedInstanceState()를 사용해서는 안 됩니다. 대신 기본 유형 및 String 같은 단순하고 작은 객체만 저장해야 합니다.たとえば、テキストフィールドの値、チェックボックスの状態、リストのスクロール位置などです.
    Save UI states
    コメントサイト
  • https://developer.android.com/guide/fragments
  • https://developer.android.com/guide/components/fragments?hl=ko