Android:片段backStack

Ori*_*itm 38 android android-fragments back-stack

我试图在调用方法时加载一个新片段.此方法创建一个新片段并"替换"另一个片段:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好,直到我回去.当我回去时,应删除最后一个片段.在我要实现活动方法之前

public void onBackPressed(){}
Run Code Online (Sandbox Code Playgroud)

删除最后一个片段,我想知道我是否正确处理片段更改.看起来我在这里遗漏了一些东西..

K R*_*eck 88

如果你真的想要替换片段,那么使用replace()方法而不是执行remove()和add().

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(..............);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit(); 
Run Code Online (Sandbox Code Playgroud)

不要忘记执行addToBackStack(null),这样您之前的状态将被添加到backstack,允许您使用后退按钮返回.

另请参阅https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int,android.app.Fragment,java.lang.String).

另一个好的来源是http://developer.android.com/guide/components/fragments.html(搜索replace()函数).

  • replace()== remove(thisFragment).add(anotherFragment).. Replace等于这个顺序中的两个方法. (3认同)