Android: Fragments backStack

我是研究僧i 提交于 2019-11-26 06:07:11

问题


Im trying to load an new fragment when a method is called. This method creates a new fragment and \"replaces\" the other fragment:

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);
    }
}

This works fine, until i go back. The last fragment, should be removed when i go back. Before i\'m going to implement methods on the activities

public void onBackPressed(){}

to remove the last fragment, i want to know if i handle the fragment change correctly. It looks like i\'m missing something here..


回答1:


If you really want to replace the fragment then use replace() methode instead of doing a remove() and an add().

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

Don't forget to do the addToBackStack(null) so your previous state will be added to the backstack allowing you to go back with the back button.

See also https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int, android.app.Fragment, java.lang.String) .

Another good source is http://developer.android.com/guide/components/fragments.html (search for replace() function).




回答2:


Just remove first and the call super.onBackPressed

public void onBackPressed(){

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

}



回答3:


//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;
}


来源:https://stackoverflow.com/questions/14354885/android-fragments-backstack

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!