Custom Back Stack for each Fragment in TabHost in Android

后端 未结 1 478
一整个雨季
一整个雨季 2020-12-05 21:39

Since the TabActivity is deprecated I tried to replace it with Fragments which has been already mentioned in developer android website. But as you guys already know there wa

相关标签:
1条回答
  • 2020-12-05 22:30

    I modified googles sample tablistener to following:

    public static class TabListener<T extends SherlockFragment> implements ActionBar.TabListener {
        private final SherlockFragmentActivity mActivity;
        private final String mTag;
        private final Class<T> mClass;
        private final Bundle mArgs;
        public SherlockFragment mFragment;
        private final Stack<SherlockFragment> mStack;
    
        public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
            this(activity, tag, clz, null, null);
        }
    
        public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz, Bundle args, Stack<SherlockFragment> stack) {
            mActivity = activity;
            mTag = tag;
            mClass = clz;
            mArgs = args;
            mStack = stack;
    
            // Check to see if we already have a fragment for this tab, probably
            // from a previously saved state.  If so, deactivate it, because our
            // initial state is that a tab isn't shown.
            mFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
            if (mFragment != null && !mFragment.isDetached()) {
                FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
                ft.detach(mFragment);
                ft.commit();
            }
        }
    
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // we need to reattach ALL fragments thats in the custom stack, if we don't we'll have problems with setCustomAnimation for fragments.
            if (mFragment == null) {
                mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName(), mArgs);
                ft.replace(android.R.id.content, mFragment, mTag);
            } else {
                ft.attach(mFragment);
            }
            if(mStack != null) {
                for(SherlockFragment fragment: mStack) {
                    ft.attach(fragment);
                }
            }
        }
    
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            if (mFragment != null) {
                ft.detach(mFragment);
            }
            if(mStack != null) {
                for(SherlockFragment fragment: mStack) {
                    if(fragment!= null && !fragment.isDetached()) {
                        ft.detach(fragment);
                    }
                }
            }
        }
    
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
        }
    }
    

    And the activity onKeyDown methode I override to following:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            int index = getSupportActionBar().getSelectedNavigationIndex();
            Stack<SherlockFragment> stack = null;
            SherlockFragment fragment = null;
            String rootTag = null;
            switch(index) {
                case 0:
                    stack = mWatersTabListener.mStack;
                    fragment = mWatersTabListener.mFragment;
                    rootTag = mWatersTabListener.mTag;
                    break;
                case 1:
                    stack = mHarborTabListener.mStack;
                    fragment = mHarborTabListener.mFragment;
                    rootTag = mHarborTabListener.mTag;
                    break;
            }
    
            if(stack.isEmpty()) {
                return super.onKeyDown(keyCode, event);
            } else {
                SherlockFragment topFragment = stack.pop();
                FragmentManager fragmentManager = getSupportFragmentManager();
    
                FragmentTransaction ft = fragmentManager.beginTransaction();
    
                ft.setCustomAnimations(R.anim.fragment_slide_right_enter,
                        R.anim.fragment_slide_right_exit);
    
                if(topFragment != null && !topFragment.isDetached()) {
                    ft.detach(topFragment);
                }
    
                if(stack.isEmpty()) {
                    ft.replace(android.R.id.content, fragment, rootTag);
                    ft.commit();
                    return true;
                } else {
                    SherlockFragment nextFragment = stack.peek();
                    ft.replace(android.R.id.content, nextFragment);
                    ft.commit();
                    return true;
                }
            }
        }
        return super.onKeyDown(keyCode, event);
    }
    

    The important things to take note of is that you have to attach all fragments in your custom stack when selected and you have to detach all as well when unselected. If there is problem with understanding the code snippets just ask.

    0 讨论(0)
提交回复
热议问题