add()
方法関連
add(R.id.layout、fragment、tag)メソッドは、実際には、受信レイアウトにビューのレイヤーを追加することです。同じレイアウトに複数のフラグメントを追加しようと試みることはできますが、重複が発生します。Fragmentを呼び出すadd()メソッドのライフサイクルは次のとおりです。
remove()
remove(fragment)はフラグメントインスタンスを破棄することであり、そのライフサイクル呼び出しは次のとおりです。
replace()
方法関連
replace(R.id.layout、fragment、tag)メソッドは、古いフラグメントを置き換え(このレイアウトに表示されているすべてのフラグメントを破棄します)、新しい着信フラグメントを作成して、ビューに表示します。新しい着信フラグメントは、add()メソッドによって呼び出されるのと同じライフサイクルを実行し、古いフラグメントが順番に呼び出されます。
ただし、古いフラグメントによって実行されるライフサイクルには、大前提があります。つまり、トランザクションはそうではありません。ロールバックスタックに送信されます(別の状況については以下で説明します)。
hide()
メソッドとshow()
メソッド
hide()とshow()は、最終的にフラグメントビューを実行させ、フラグメントview.setVisibility
のライフサイクルを呼び出しませんが、hide()メソッドを使用すると、非表示のフラグメントが呼び出されます。onHiddenChanged(hidden: Boolean)
addToBackStack()
およびpopBackStack()
関連
addToBackStack()メソッドは、このトランザクション操作をバックスタックに配置することです(以前は、フラグメントをバックスタックに配置していると思っていました)。
検証:
val transition1:FragmentTransaction=manager.beginTransaction()
transition1.add(R.id.tv_fa,fFragment,"first")
.addToBackStack("aa") //tag是用来标记本次事务操作的
.commit()
val transaction2=manager.beginTransaction()
transaction2.add(R.id.tv_fa,sFragment,"second")
.add(R.id.tv_fa,tFragment,"thrid")
.addToBackStack("bb")
.commit()
上記のコードでは、3つのフラグメントを追加して、3つがオーバーラップするようにしました。
あまり見栄えの悪いヤジ。
この時点で、[戻る]ボタンをクリックすると、次のようになります
。ライフサイクル呼び出しは次のようになります。
はい、[戻る]ボタンをクリックすると、最後にコミットされたトランザクション操作がスタックからポップアウトされるため、thridFragmentとsecondFragmentの両方がスタックからクリアされます。
popBackStack()
追加すると
bt.setOnClickListener { supportFragmentManager.popBackStack("aa",FragmentManager.POP_BACK_STACK_INCLUSIVE) }
ボタンをクリックすると、この
popBackStack(tag、flag)は[戻る]ボタンをクリックするのと似ています。これは、スタックからトランザクション操作レコードを作成するためのものです。ここでの最初のパラメーターは、トランザクションをフォールバックスタックに追加するために設定したタグです。2番目のパラメーターFragmentManager.POP_BACK_STACK_INCLUSIVE
は、ロールバックスタック内のトランザクション(トランザクションを含む)より上のすべてのトランザクションがポップされることを示します。フラグは0にすることもできます。これは、ロールバックスタックトランザクション内のトランザクション(トランザクションを含まない)より上のすべてのトランザクションがポップされることを意味します。
コード内の「aa」は、私が初めて送信したトランザクション操作であるFragmentManager.POP_BACK_STACK_INCLUSIVE)
ため、トランザクションとその上のすべてのトランザクションがスタックからポップされます。したがって、ボタンをクリックした後、レイアウトにフラグメントは表示されません。
また、popBackStack()
最下層はハンドラーを介して実行されるため、すぐには実行されず、すぐにpopBackStackImmediate()
実行されます。
トランザクション操作をロールバックスタックに追加すると、replaceを使用するとどうなりますか
val transition1:FragmentTransaction=manager.beginTransaction()
transition1.add(R.id.tv_fa,fFragment,"first")
.addToBackStack("aa")
.commit()
val bt=findViewById<Button>(R.id.bt_main)
bt.setOnClickListener {
val faFragemnt=MyFragment("fourth")
val transaction=manager.beginTransaction()
transaction.replace(R.id.tv_fa,faFragemnt,"fourth")
.commit()
}
ボタンをクリックする
と、firstFragmentライフサイクルの呼び出しが表示されます。これは、DestoryViewによってのみ破棄され、完全には破棄されません。これは、replaceを直接使用する場合とは異なります。つまり、ロールバックスタックに追加されたフラグメントは、replaceメソッドによって破棄されませんが、DestoryViewでは、findFragmentByTag()
またはを介しfindFragmentById()
てフラグメントを見つけることができます。トランザクション操作がロールバックスタックに追加されると、removeの使用も同様の状況になり、対応するフラグメントインスタンスは削除されませんが、destroyViewが削除されます。