メソッドが呼び出されたときに新しいフラグメントをロードしようとしています。このメソッドは、新しいフラグメントを作成し、他のフラグメントを「置換」します。
private void showTestFragment(Fragment oldFragment, boolean addBackStack, BaseAdapter adapter, int position) {
Cursor cursor = (Cursor)adapter.getItem(position);
if(cursor != null){
int idx = cursor.getColumnIndexOrThrow(Episode._ID);
long rowId = cursor.getLong(idx);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if(oldFragment != null){
Log.i(TAG, "Removing the old fragment");
fragmentTransaction.remove(oldFragment);
}
TestFragment testFragment = new TestFragment();
testFragment.setId(rowId);
fragmentTransaction.add(Android.R.id.content, testFragment);
if(addBackStack){
Log.i(TAG, "Added to the backstack");
fragmentTransaction.addToBackStack(TAG);
}
fragmentTransaction.commit();
Fragment f = getFragmentManager()
.findFragmentById(R.id.index);
Log.i(TAG, "after commit, frag is "+ f);
}
}
私が戻るまで、これはうまく機能します。最後のフラグメントは、戻るときに削除する必要があります。アクティビティにメソッドを実装する前に
public void onBackPressed(){}
最後のフラグメントを削除するには、フラグメントの変更を正しく処理するかどうかを知りたいです。ここに何か足りないようです。
フラグメントを本当に置き換えたい場合は、remove()およびadd()を実行する代わりにreplace()メソッドを使用します。
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(..............);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
AddToBackStack(null)を実行することを忘れないでください。これにより、前の状態がバックスタックに追加され、戻るボタンで戻ることができます。
もう1つの優れたソースは http://developer.Android.com/guide/components/fragments.html (replace()関数を検索)です。
最初に削除して、super.onBackPressedを呼び出すだけです
public void onBackPressed(){
// here remove code for your last fragment
super.onBackPressed();
}
//lets wait for systems back to finish
super.onBackPressed();
//here we believe a fragment was popped, so we need to remove the fragment from ourbackstack
if(fragmentBackStack.size()>0)
{
Log.d("custombackstack","before back: "+fragmentBackStack.size()+" current:"+fragmentBackStack.peek());
fragmentBackStack.pop();
}
//after popping is the size > 0, if so we set current fragment from the top of stack, otherwise we default to home fragment.
if(fragmentBackStack.size()>0)
{
Log.d("custombackstack","after back: "+fragmentBackStack.peek());
currentFragment = fragmentBackStack.peek();
}
else
{
//back stack empty
currentFragment = HOME_FRAGMENT;
}