【问题标题】:Can a fragment be a host to a view pager instead of an activity?片段可以成为查看器而不是活动的宿主吗?
【发布时间】:2016-04-22 17:31:17
【问题描述】:

可以将视图分页器放入片段的布局中,这样该片段将成为其他几个片段的宿主吗?到目前为止,我只看到了作为主持人的活动。

【问题讨论】:

    标签: android tabs


    【解决方案1】:

    是的,你可以,使用下面的代码

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    
    ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager);
    mViewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    }
    

    在这里查看完整的实现https://github.com/marcoRS/nested-fragments/tree/master/src/com/burnside/digital/nestedfragments

    【讨论】:

    • getChiledFragmentManager 仅适用于 api > 17。我目前使用 16,有没有办法在不将所有片段更改为 v4 的情况下克服该问题(因为 getSupportChildFragment 需要我将所有片段切换到 v4 (但要全部更改它们是不现实的,因为我有大量它们而且它们都是本地的)
    • 你支持一个非常旧的 API 版本,它几乎已经死了,切换到 API17 或 + 并且不要花时间学习很快就会消失的东西......看看这里developer.android.com/about/dashboards/index.html
    • 顺便说一句,我找到了 APIstackoverflow.com/questions/25595388/…
    【解决方案2】:

    是的,这是可能的。 这是一个示例(在带有 ViewPager 的 Fragment 内使用 TabHost):

        public class GroupFragment extends Fragment {
    
        private static TabLayout tabLayout;
        private static ViewPager viewPager;
        private static final int int_items = 4 ;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
                View x =  inflater.inflate(R.layout.tab_layout,null);
                tabLayout = (TabLayout) x.findViewById(R.id.tabs);
                viewPager = (ViewPager) x.findViewById(R.id.viewpager);
    
            viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    
            tabLayout.post(new Runnable() {
                @Override
                public void run() {
                        tabLayout.setupWithViewPager(viewPager);
                       }
            });
    
            return x;
    
        }
    
        class MyAdapter extends FragmentPagerAdapter{
    
            public MyAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public Fragment getItem(int position){
                switch (position){
                    case 0 : return new PrimaryFragment();
                    case 1 : return new SocialFragment();
                    case 2 : return new UpdatesFragment();
                    case 3 : return new TeamFragment();
                }
                return null;
            }
    
            @Override
            public int getCount() {
    
                return int_items;
    
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
    
                switch (position){
                    case 0 :
                        return "Grupo A";
                    case 1 :
                        return "Grupo B";
                    case 2 :
                        return "Grupo C";
                    case 3:
                        return "Grupo D";
                }
                    return null;
            }
        }
    
    }
    

    片段的布局是这样的:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="wrap_content">
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            app:tabGravity="fill"
            app:tabMode="fixed"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </android.support.design.widget.TabLayout>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </android.support.v4.view.ViewPager>
    
    </LinearLayout>
    

    希望对你有帮助。

    【讨论】:

    • TabLayout 不能用 PagerTabStrip 代替标签指示?
    • 是的,你可以替换它。
    • getChildFragmentManager() 有问题。它说它需要 min api 17。(我在 16)
    • 使用 getSupportChildFragmentManager()。
    • 但我的片段是原生的,不是 v4
    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2012-05-15
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多