【问题标题】:How to set a ViewPager inside a Fragment如何在 Fragment 中设置 ViewPager
【发布时间】:2013-09-29 01:35:48
【问题描述】:

我需要在片段中放置一个 ViewPager,但我有两个片段,片段 1 是我的 MENU,片段 2 我想用作 ViewPagerIndicator。

但是一个片段不能有另一个片段……我需要为此做什么?

【问题讨论】:

    标签: android android-fragments android-viewpager android-nested-fragment


    【解决方案1】:

    从 Android 4.2 开始,有嵌套片段。http://developer.android.com/about/versions/android-4.2.html#NestedFragments 支持库现在还包括对旧 Android 版本的支持。

    所以你可以这样做:

    @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

    【讨论】:

    • 但这是不可能的,因为我不能在我的 Fragment 2 中放置一个 FragmentActivity,因为 Fragment 父级是一个 FragmentActivity,而子级(片段 2)需要是一个 fragmentActivity 才能拥有选项卡。并且在 github 示例中,不要将片段放入其他片段中。
    • 为什么还需要片段 1?难道你不能只有一个引用不同片段的浏览器,然后在它下面有片段2吗?
    • 但片段 1 始终是相同的,这看起来会发生变化,并且不希望这样......有什么想法吗?
    • 是的,当您启动适配器时,只需使用 getChildFragmetManager() 而不是 getFragmentManager() 或 getSupportFragmentManger()。它肯定会起作用:),快乐编码。
    • 成功了。在片段中初始化 ViewPagerAdapter 时,我使用的是 getSupportFragmentManager() 而不是 getChildFragmentManager()。
    【解决方案2】:

    您必须使用getChildFragmentManager() 而不是getSupportFragmentManager() 才能在片段中获取FragmentManger。 但是你不应该使用FragmentStatePagerAdapter 而不是FragmentPagerAdapter

    【讨论】:

    • “不使用 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter”.. 解开三重否定,你的意思是我们应该使用 FragmentPagerAdapter,对吗?为什么会这样?
    【解决方案3】:

    只需在 Fragments 中使用 getChildFragmentManager() 而不是 getSupportFragmentManager()

    内部片段

    new ViewPagerAdapter(getChildFragmentManager());
    

    内部活动

    new ViewPagerAdapter(getSupportFragmentManager());
    

    简单代码

    fragment_sample.xml布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tablayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <androidx.viewpager.widget.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    
    </LinearLayout>
    

    SampleFragment.java

    public class SampleFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View fragmentView = inflater.inflate(R.layout.fragment_sample, container, false);
            return fragmentView;
        }
    
        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            // find views by id
            ViewPager viewPager = view.findViewById(R.id.viewpager);
            TabLayout tabLayout = view.findViewById(R.id.tablayout);
    
            // attach tablayout with viewpager
            tabLayout.setupWithViewPager(viewPager);
    
            ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
    
            // add your fragments
            adapter.addFrag(new SampleFragment(), "Tab1");
            adapter.addFrag(new SampleFragment2(), "Tab2");
            adapter.addFrag(new SampleFragment3(), "Tab3");
    
            // set adapter on viewpager
            viewPager.setAdapter(adapter);
        }
    }
    

    ViewPagerAdapter.java

    // common adapter for all view pager in your project.
    public class ViewPagerAdapter extends FragmentStatePagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();
    
        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }
    
        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }
    
        @Override
        public int getCount() {
            return mFragmentList.size();
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    
        public void addFrag(Fragment fragment) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add("");
        }
    
        public void addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }
    }
    

    重要的相关链接

    【讨论】:

    • SampleFragment() 应将adapter.addFrag(new SampleFragment(), "Tab1"); 行中的SampleFragment1() 更改为SampleFragment1(),因为SampleFragment() 已定义为包含ViewPager @Khemraj 的片段
    【解决方案4】:

    这是可能的。尝试执行此代码 view_pager_fragment.xml 文件

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appBarLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tab"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
    </android.support.design.widget.AppBarLayout>
    
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    

    ViewPagerFragment

    ViewPager viewPager;
    TabLayout tabLayout;
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tracks, container, false);
    
        viewPager = (ViewPager) view.findViewById(R.id.viewpager);
        tabLayout = (TabLayout) view.findViewById(R.id.tab);
    
        return view;
    }
    
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
        setupViewPager(viewPager);
        tabLayout.setupWithViewPager(viewPager);
    
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
    
            }
    
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
    
            }
    
            @Override
            public void onTabReselected(TabLayout.Tab tab) {
    
            }
        });
    }
    
    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());``
    
      
    
        viewPager.setAdapter(viewPagerAdapter);
    }
    
    private class ViewPagerAdapter extends FragmentPagerAdapter {
    
        public ViewPagerAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }
    
        @Override
        public Fragment getItem(int position) {
            if(position == 0) return new FirstFragment();
            if(position == 1) return new SecoundFragment();
            if(position == 2) return new LoginFragment();
            throw new IllegalStateException("Position is unexpectedly " + position);
        }
    
        @Override
        public int getCount() {
            return 3;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            if(position == 0) return "First";
            if(position == 1) return "Secound";
            if(position == 2) return "Login";
            throw new IllegalStateException("Position is unexpectedly " + position);
        }
    }
    

    【讨论】:

      【解决方案5】:

      借助 Android Support V4 库,您可以在另一个片段中添加一个片段。尝试使用它,它可能会解决您的问题。

      【讨论】:

      • 但这是不可能的,因为我不能将 FragmentActivity 放在我的 Fragment 2 中,因为片段父级是 FragmentActivity,而子级(片段 2)需要是 fragmentActivity 才能拥有选项卡。有什么想法吗?
      • 哦,但是等等,你可以把 2 个片段放到一个没有 fragmentActivity 的片段中,你知道吗?或者也许你有理由这样做......
      【解决方案6】:

      在阅读了一些示例之后,您不能在 FragmentActivity 中包含 FragmentActivity。 不需要有两个片段,这需要一个 FragmentPageAdapter ......我只需要这样做。

      <android.support.v4.view.ViewPager
              android:id="@+id/pager"
              android:layout_width="match_parent"
              android:layout_height="0px"
              android:layout_weight="1" >
      </android.support.v4.view.ViewPager>
      
      <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_weight="0"
              android:gravity="center"
              android:measureWithLargestChild="true"
              android:orientation="horizontal" >
      
      <Button
                  android:id="@+id/first"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="First" >
              </Button>
      
      <Button
                  android:id="@+id/last"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="Last" >
      </Button>
      </LinearLayout>
      

      来源: http://www.truiton.com/2013/05/android-fragmentpageradapter-example/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        相关资源
        最近更新 更多