如何在片段中设置ViewPager

Gil*_*rra 45 android android-fragments android-viewpager android-nested-fragment

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

但是片段不能有另一个片段......我需要做些什么呢?

在此输入图像描述

Rya*_*n S 98

从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()));
    }
Run Code Online (Sandbox Code Playgroud)

完整实现:https://github.com/marcoRS/nested-fragments/tree/master/src/com/burnside/digital/nestedfragments


小智 33

你必须使用getChildFragmentManager()而不是getSupportFragmentManager()FragmentManger里面的片段.但你不应该使用FragmentStatePagerAdapter而不是FragmentPagerAdapter.

  • “不使用 FragmentStatePagerAdapter 而不是 FragmentPagerAdapter”.. 解开三重否定,你的意思是我们应该使用 FragmentPagerAdapter,对吗?为什么是这样? (2认同)

Khe*_*raj 15

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

内部片段

new ViewPagerAdapter(getChildFragmentManager());
Run Code Online (Sandbox Code Playgroud)

内部活动

new ViewPagerAdapter(getSupportFragmentManager());
Run Code Online (Sandbox Code Playgroud)

简单代码

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>
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

重要相关链接


归档时间:

查看次数:

68347 次

最近记录:

7 年,1 月 前