(ActionBar) Tabs + Pager + detail Fragments inside ViewPager 容器 [英] (ActionBar) Tabs + Pager + detail Fragments inside ViewPager container

查看:14
本文介绍了(ActionBar) Tabs + Pager + detail Fragments inside ViewPager 容器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于 ActionBarSherlock,我想要(操作栏)选项卡 + 寻呼机.我在该寻呼机容器中使用 Fragments.我已经得到了 http://actionbarsherlock.com/ 工作的示例,但是我无法在该寻呼机容器中获取详细信息片段当我点击让我们说第一个片段中的一个列表项时.

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/ working, but I can't manage to get a details fragment inside that pager container when I would click on let's say a listitem in the first fragment.

难道就不可能有这样的东西:

Is it impossible to have something like this:

带有标签和分页器容器的活动

Activity with Tabs and pager container

  • Tab1 下分页器容器内的片段 A
    • 单击片段 A 中的某个内容,然后在 Tab1 下的同一寻呼机容器中显示片段 B.

    然后片段 A 不可见,只有片段 B 可见,但所有选项卡也可见.

    Fragment A is then not visible, only Fragment B is visible, but also all the Tabs.

    目前我认为只有在单击片段 A 中的某些内容后才能启动一个新活动(其中包含片段 B).

    At the moment I think only a new activity (which would hold Fragment B inside it) can be started after clicking something in Fragment A.

    推荐答案

    这是我对(Tabs + Fragment + ViewPager)的解决方案,它对我有用,希望对你也有用

    Here is my solution for the (Tabs + Fragment + ViewPager) it is works for me as i wanted, hope that works for you as well

    这里是xml文件<代码>

    here is the xml file

     <LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal" >
    
            <android.support.v4.view.ViewPager
                android:id="@+id/pager"
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="5" />
    
            <FrameLayout
                android:id="@+id/fragment_details"
                android:layout_width="0px"
                android:layout_height="match_parent"
                android:layout_weight="4.3" />
        </LinearLayout>
    

    这是 MainActivity.java 的代码,我只发布相关代码,以便您管理它

    here is the code for MainActivity.java I'll post relevant code only so you'll have to manage it

    <代码>

    public class MainActivity extends FragmentActivity implements
            DialogInterface.OnDismissListener, TabDataResponder {
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            artistTab = getSupportActionBar().newTab().setText(
                    R.string.tab_name_artist);
            albumTab = getSupportActionBar().newTab().setText(
                    R.string.tab_name_album);
            songTab = getSupportActionBar().newTab().setText(
                    R.string.tab_name_songs);
    
            map = new HashMap<String, Integer>();
            mViewPager = (ViewPager) findViewById(R.id.pager);
            FrameLayout deatil = (FrameLayout) findViewById(R.id.fragment_details);
            mDualPane = (deatil != null) && (deatil.getVisibility() == View.VISIBLE);
            mTabsAdapter = new TabsAdapter(this, getSupportActionBar(), mViewPager);
    
            if (savedInstanceState != null) {
                flag = true;
                index = savedInstanceState.getInt("index");
            }
    
            setUpTabView();
    
        }
    
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putInt("index", getSupportActionBar()
                    .getSelectedNavigationIndex());
        }
    
        private void setUpTabView() {
            mTabsAdapter.addTab(artistTab, ArtistFragment.class, null);
            mTabsAdapter.addTab(albumTab, AlbumFragment.class, null);
            mTabsAdapter.addTab(songTab, SongFragment.class, null);
            getSupportActionBar().setSelectedNavigationItem(index);
        }
    
        public static class TabsAdapter extends FragmentPagerAdapter implements
                ViewPager.OnPageChangeListener, ActionBar.TabListener {
    
            private FragmentActivity mContext;
            private ActionBar mActionBar;
            private final ViewPager mViewPager;
    
            private final ArrayList<String> mTabs = new ArrayList<String>();
            private TabDataResponder responder;
    
            public TabsAdapter(FragmentActivity activity, ActionBar actionBar,
                    ViewPager pager) {
    
                super(activity.getSupportFragmentManager());
                mContext = activity;
                mActionBar = actionBar;
                mViewPager = pager;
    
                // TabDataResponder is an interface which is implemented in MainActivity
                // You can find implementation @ the last
    
                responder = (TabDataResponder) activity;
                mViewPager.setAdapter(this);
                mViewPager.setOnPageChangeListener(this);
    
                //I have used map to save state of the fragment
                map.put(SongFragment.TYPE_FRAGMENT.trim(), 0);
                map.put(AlbumFragment.TYPE_FRAGMENT.trim(), 0);
                map.put(ArtistFragment.TYPE_FRAGMENT.trim(), 0);
            }
    
            public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
                mTabs.add(clss.getName());
                // mArgs.add(args);
                mActionBar.addTab(tab.setTabListener(this));
                notifyDataSetChanged();
            }
    
            @Override
            public int getCount() {
                return mTabs.size();
            }
    
            @Override
            public Fragment getItem(int position) {
                return Fragment
                        .instantiate(mContext, mTabs.get(position), /*
                                                                     * mArgs.get(
                                                                     * position)
                                                                     */null);
            }
    
            @Override
            public void onPageScrolled(int position, float positionOffset,
                    int positionOffsetPixels) {
            }
    
            @Override
            public void onPageSelected(int position) {
                Log.i(TAG, "PageSelected....");
                mActionBar.setSelectedNavigationItem(position);
            }
    
            @Override
            public void onPageScrollStateChanged(int state) {
                Log.i(TAG, "ScrollSateChanged....");
            }
    
            @Override
            public void onTabReselected(Tab tab, FragmentTransaction ft) {
            }
    
            @Override
            public void onTabSelected(Tab tab, FragmentTransaction ft) {
                mViewPager.setCurrentItem(tab.getPosition());
                String a = null;
                if (mDualPane) {
                    a = mTabs.get(tab.getPosition());
                    responder.loadData(a, map.get(a));
                }
            }
    
            @Override
            public void onTabUnselected(Tab tab, FragmentTransaction ft) {
                Log.i(TAG, "Tab is released now....");
            }
        }
    
        @Override
        public void onDismiss(DialogInterface dialog) {
            setUpTabView();
    
        }
    //This interface must be call from fragment class 
    //@ the time of event you want to show detail 
    // pass the class name in the type argument using class.getName() method
        @Override
        public void loadData(String type, int index) {
            DetailFragment viewer = (DetailFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.fragment_details);
            if (mDualPane) {
                if (viewer == null || viewer.getShownIndex() != index
                        || viewer.getTypeFragment() != type) {
    
                    DetailFragment df = DetailFragment.newInstance(index, type);
                    getSupportFragmentManager()
                            .beginTransaction()
                            .replace(R.id.fragment_details, df)
                            .setTransition(
                                    FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                            .commit();
                    map.put(type.trim(), index);
    
                }
    
            } else {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, DetailActivity.class);
                intent.putExtra("index", index);
                intent.putExtra("type", type);
                startActivity(intent);
            }
        }
    }
    

    这是我处理细节片段的方法,效率不高,但有点工作

    <代码>

    public class DetailFragment extends Fragment{
    
        public static DetailFragment newInstance(int index, String  TYPE_FRAGMENT) {
            DetailFragment f = new DetailFragment();
    
            // Supply index input as an argument.
            Bundle args = new Bundle();
            args.putInt("index", index);
            args.putString("type", TYPE_FRAGMENT);
            f.setArguments(args);
    
            return f;
        }
    
    
    
        public int getShownIndex() {
            return getArguments().getInt("index", 0);
        }
    
        public String getTypeFragment(){
            String a = getArguments().getString("type");
            return a;
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
            //template is blank layout
            View view =  inflater.inflate(R.layout.template, container, false);
            if(getTypeFragment().equals(ArtistFragment.TYPE_FRAGMENT)){
                view = null;
                view = inflater.inflate(R.layout.artist_details, container, false);
                //....
    
            }
            else if(getTypeFragment().equals(AlbumFragment.TYPE_FRAGMENT)){
    
                //do's for album fragment
            }
            else if(getTypeFragment().equals(SongFragment.TYPE_FRAGMENT)){
                //do's for song fragment
            }
            return view;
        }
    
    }
    

    不要在各自的片段中保存选项卡的状态,否则会发生冲突,我们已经在这里做了

    这篇关于(ActionBar) Tabs + Pager + detail Fragments inside ViewPager 容器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆