38

メソッドが呼び出されたときに新しいフラグメントをロードしようとしています。このメソッドは、新しいフラグメントを作成し、他のフラグメントを「置き換え」ます。

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(){}

最後のフラグメントを削除するには、フラグメントの変更を正しく処理するかどうかを知りたいです。ここで何かが足りないようです。

4

3 に答える 3

88

本当にフラグメントを置き換えたい場合は、remove()とadd()を実行する代わりに、replace()メソッドを使用してください。

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(..............);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit(); 

addToBackStack(null)を実行することを忘れないでください。そうすれば、前の状態がバックスタックに追加され、戻るボタンで戻ることができます。

https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int、android.app.Fragment、java.lang.String)も参照してください。

もう1つの優れたソースは、http://developer.android.com/guide/components/fragments.html(replace()関数を検索)です。

于 2013-01-16T16:09:51.193 に答える
4

最初に削除して、super.onBackPressedを呼び出します

public void onBackPressed(){

    // here remove code for your last fragment
    super.onBackPressed();

}
于 2013-01-16T09:24:58.213 に答える
0
//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;
}
于 2014-03-12T06:23:30.093 に答える