(ActionBar) Tabs + Pager + detail Fragments inside ViewPager container

前端 未结 4 1457
死守一世寂寞
死守一世寂寞 2020-12-23 18:31

For ActionBarSherlock I would like to have (Action Bar) Tabs + Pager. I use Fragments inside that pager container. I already got the examples of http://actionbarsherlock.com

4条回答
  •  自闭症患者
    2020-12-23 18:50

    I still did not find a possibility to have a Pager container where fragments should be loaded in and also keep the (ActionBar) Tabs. I have however found a really dirty solution to acomplish this, with starting intens (Main Activity with the Tabs) and finishing the previous ones when the backbutton doesn't need it anymore.

    I adapted the code from ABS: Support Demos - Tabs and Pager. But again it's really dirty:

    LoaderCursorSupport.CursorLoaderListFragment under Tab2

    @Override public void onListItemClick(ListView l, View v, int position, long id) {
            Intent intent = new Intent();
            intent.setClass(getActivity(), ActionBarTabsPager.class);
            intent.putExtra("index", position);
            intent.putExtra("fragment", "details");
            intent.putExtra("tab", 1);
            ActionBarTabsPager.mPreviousActivity = getActivity();
    
            startActivity(intent);
    

    ActionBarTabsPager (Main Activity with Tabs)

    public class ActionBarTabsPager extends FragmentActivity {
    ViewPager mViewPager;
    TabsAdapter mTabsAdapter;
    static Activity mPreviousActivity;
    static Activity mActivity;
    static int mTabPosition = -1;
    static Boolean mTabRefreshed = false;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.actionbar_tabs_pager);
        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
        ActionBar.Tab tab1 = getSupportActionBar().newTab().setText("Tab 1");
        ActionBar.Tab tab2 = getSupportActionBar().newTab().setText("Tab 2");
        ActionBar.Tab tab3 = getSupportActionBar().newTab().setText("Tab 3");
        ActionBar.Tab tab4 = getSupportActionBar().newTab().setText("Tab 4");
        String fragment = "";
        try {
            Bundle bundle = this.getIntent().getExtras();
            fragment = bundle.getString("fragment");
            mTabPosition = bundle.getInt("tab");
        } catch (Exception ex) {
        }
    
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mTabsAdapter = new TabsAdapter(this, getSupportActionBar(), mViewPager);
        mTabsAdapter.addTab(tab1, FragmentStackSupport.CountingFragment.class);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ECLAIR) {
            mTabsAdapter.addTab(tab2, FragmentStackSupport.CountingFragment.class);
            mTabsAdapter.addTab(tab3, FragmentStackSupport.CountingFragment.class);
            mTabsAdapter.addTab(tab4, FragmentStackSupport.CountingFragment.class);
        } else {
            if (!fragment.contains("details")) {
                mTabsAdapter.addTab(tab2, LoaderCursorSupport.CursorLoaderListFragment.class);
            } else {
                mTabsAdapter.addTab(tab2, ExampleFragment.class);
            }
            mTabsAdapter.addTab(tab3, LoaderCustomSupport.AppListFragment.class);
            mTabsAdapter.addTab(tab4, LoaderThrottleSupport.ThrottledLoaderListFragment.class);
        }
    
        if (savedInstanceState != null) {
            getSupportActionBar().setSelectedNavigationItem(savedInstanceState.getInt("index"));
        }
    
        if (mTabPosition > -1) {
            mTabsAdapter.setPrimaryItem(mTabPosition);
    
            mActivity = this;
    
        }
    }
    

    Inside this Class there's a TabsAdapter

    public static class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener {
        private final Context mContext;
        private final ActionBar mActionBar;
        private final ViewPager mViewPager;
        private final ArrayList mTabs = new ArrayList();
    
    
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            if (mTabPosition > -1 && mTabRefreshed) {
                int tabPosition = tab.getPosition();
                if (mTabPosition != tabPosition) {
                    if (mPreviousActivity != null) {
                        mPreviousActivity.finish();
                        mTabRefreshed = false;
                        mPreviousActivity = null;
                        mTabPosition = -1;
                        Intent intent = new Intent();
                        intent.setClass(mContext, ActionBarTabsPager.class);
                        intent.putExtra("fragment", "home");
                        intent.putExtra("tab", tabPosition);
                        mActivity.startActivity(intent);
                        mActivity.finish();
    
                    }
                }
            }
            mViewPager.setCurrentItem(tab.getPosition());
        }
    

    Can this be done simpler? Or should I just give up on having Tabs together with fragment history? This was done before Android 3.0 with ActivityGroups and Activities, but it seems this can't be done with fragments.

提交回复
热议问题