Fragmentに関するadd,remove,replaceメソッドとロールバックスタックの関係の詳細

3066 ワード

現在のAndroid開発ではFragmentが一般的に使われていますが、Fragmentを使う過程でadd、remove、replaceの3つの方法が一般的に使われており、違いを起こしやすいので、バックスタックを加える機能がさらに乱れているので、実践の角度から関係を説明します.
開発では、ActivityのレイアウトにFrameLayoutを1つ置き、このFrameLayoutをコンテナとしてFragmentをView(Fragmentを1つのコントロールまたは1つのレイアウトと理解できる)として切り替えるのが一般的です.これに基づいて、addメソッドは、このFrameLayoutにFragmentを追加することを意味します.addメソッドを連続的に実行すると、FrameLayoutの特性に従って、FrameLayoutの中で1層1層の重複Viewに相当します.コードを見てみましょう.
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.layout = (FrameLayout) this.findViewById(R.id.content);
		int i = 0;
		while (i < 10) {
			FragmentManager fm = this.getSupportFragmentManager();
			FragmentTransaction ft = fm.beginTransaction();
			ft.add(R.id.content, new OneFragment());
			ft.commit();
			i++;
		}
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		System.out.println("    " + this.layout.getChildCount());
	}
コード内のonCreateメソッドでActivityのFrameLayoutへのFragmentの追加を10回実行し、最後にこのFrameLayoutにどれだけのChildがあるかを印刷します.
07-22 00:32:02.648: I/System.out(10480):     10
このように,このシナリオでは,addメソッドはFrameLayoutにFragmentを積層することに相当する.
remove法とadd法は相対的で、addは1層ずつ上に置き、removeは上から1層ずつ下に取り、ここでは余計なことは言わない.
さらにreplaceの方法は、私たちのこのFrameLayoutのシーンで、replaceはremoveとaddを実行し、removeと同じidのすべてのFragmentを実行し、このFragmentを入れます.次はコードを見てみましょう.
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		this.layout = (FrameLayout) this.findViewById(R.id.content);
		int i = 0;
		while (i < 10) {
			FragmentManager fm = this.getSupportFragmentManager();
			FragmentTransaction ft = fm.beginTransaction();
			ft.replace(R.id.content, new OneFragment());
			ft.commit();
			i++;
		}
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		System.out.println("    " + this.layout.getChildCount());
	}
コード内のonCreateメソッドでreplace Fragmentの操作を10回実行
ああ、最後にこのFrameLayoutの中でChildがどれだけあるかを印刷します.
07-22 00:32:02.648: I/System.out(10480):     1
このことから,10回実行したが,FrameLayoutには1つのFragmentしか存在しないことが分かる.
この3つの方法を話してから、スタックを返却する問題について話します.Activityのスタックと同様に、Activityを使用してFragmentのスタックを維持することもできます.Fragmentをロールバックスタックに追加すると、ロールバックボタンを押すたびに前回のFragmentが表示されます.
ここで、add、remove、replaceメソッド、およびロールバックスタックは基本的に関係しないという非常に重要な概念があります.ここで紛らわしい点がありますが、addも1階ずつFrameLayoutにFragmentを追加しているので、戻るボタンを押すときに1階ずつ出しているのではないでしょうか.ここでは、返品スタックに加入しない限り、全然できません.add、remove、replaceはこのインタフェース階層で操作することに相当するため、ロールバックスタックとは関係なく、いくつかの場所で似ているように見えても(ロールバックスタックは1つずつ追加され、ロールバックを押すと1つずつ弾き出されます).
では、addでFragmentを追加してロールバックスタックに追加するのと、replaceでFragmentを置換してロールバックスタックに追加するのとでは何が違いますか?
この点はインタフェースの関係を参照しなければなりません.addは1層1層上に積み重ねられています.もしあなたがその中の1層上で修正をしたら、この層に戻ると、行った操作が保留され、戻ると1層1層Fragmentが外に持ち出されます.replaceは実際に置き換えられているので、ロールバックスタックが追加されていますが、ビューを破棄する方法onDestroyViewが実行され、ロールバック時にonCreateViewメソッドを再実行してビューを再構築します.