安卓:在导航抽屉的一个片段中使用ViewPager

7
我正在开发一款Android应用程序,需要在导航抽屉的片段中实现Viewpager或选项卡。我已经按照这个教程实现了导航抽屉:导航抽屉教程 现在我的导航抽屉由3个片段组成:Fragment A、Fragment B和Fragment C。在Fragment A中,我该如何添加一个Viewpager?
4个回答

10
这是绝对可能的。您只需要为viewpager使用子片段即可。除此之外,实现很简单。创建自定义pager适配器,使用标准的viewpager api。
像这样扩展FragmentPagerAdapter:
private class MyPagerAdapter extends FragmentPagerAdapter
{
    public MyPagerAdapter (FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        switch (i) {
            case 0:
                return Fragment1;
            case 1:
                return Fragment2;

        }
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return FRAGMENT_1_NAME;
            case 1:
                return FRAGMENT_2_NAME;



        }
    }

你需要一个使用ViewPager的布局,然后在A片段中确保按照以下方式连接它:
myPagerAdapter = new MyPagerAdapter(this.getChildFragmentManager());
myPager = (ViewPager) mRoot.findViewById(R.id.pager);
myPager.setAdapter(myPagerAdapter);

请注意,除非您的最低SDK为4.2或更高版本,否则您需要使用支持库和支持片段,因为子片段是API 17。

1
这对 Android 版本低于 4.2 是可行的。 在您的片段 A onCreateView 方法中,当您填充根View时,请填充包含android.support.v4.view.ViewPager的布局:
View rootView = inflater.inflate(R.layout.your_viewpager_layout, container, false);

your_viewpager_layout.xml 应该类似于以下内容:

<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.yourapp.YourActivity" />

在你的FragmentPagerAdapter.getItem(int position)方法中,返回你想在ViewPager中显示的Fragment,就像在“普通”的ViewPager中一样。请保留HTML标签。

0

有一个ViewPager类是支持库的一部分。您应该能够与PagerAdapter一起使用它。


0

好的,这是选项卡或视图分页器片段类的代码:

public class TabbedFragment extends Fragment {
private SectionsPagerAdapter mSectionsPagerAdapter;
public static final String TAG = TabbedFragment.class.getSimpleName();

/**
 * The {@link ViewPager} that will host the section contents.
 */
ViewPager mViewPager;


public static TabbedFragment newInstance() {
    return new TabbedFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_viewpager_network, container, false);
    mSectionsPagerAdapter = new SectionsPagerAdapter(
            getChildFragmentManager());

    mViewPager = (ViewPager) v.findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    return v;
}


public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.
        if (position == 0)
            return FragmentOne.getInstance();
        else
            return FragmentTwo.getInstance();
    }

    @Override
    public int getCount() {
        // Show 2 total pages.
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
            case 0:
                return "Fragment 1";
            case 1:
                return "Fragment 2";
        }
        return null;
    }
  }
}

XML文件tabbed_fragment.xml

<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!--
This title strip will display the currently visible page title, as well as the page
titles for adjacent pages.
-->

<android.support.v4.view.PagerTitleStrip
    android:id="@+id/pager_title_strip"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:background="#33b5e5"
    android:paddingBottom="4dp"
    android:paddingTop="4dp"
    android:textColor="#fff" />

</android.support.v4.view.ViewPager>

在使用导航抽屉的活动类中的用法,注意:我使用了Android Studio 1.2预先提供的导航抽屉代码。

@Override
public void onNavigationDrawerItemSelected(int position) {
    boolean isChild = getSharedPreferences(Constansts.PREFERENCE_NAME,0).getBoolean(Constansts.IS_CHILD,false);
    Fragment fragment = null;
    if (lastSelectedPosition == position)
        return;
    lastSelectedPosition = position;
    switch (position) {
        case 0:
            fragment = HomeFragment.getInstance();
            break;
        case 1:
            fragment = HomeFragment.getInstance();
            break;
        case 2:
            fragment = UserProfileFragment.getInstance();
            break;
        case 3:
            fragment = TabbedFragment.getInstance();
            break;
    }
    if (fragment == null) {
        fragment = HomeFragment.getInstance();
    }
    fragmentManager = getSupportFragmentManager();
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.container, fragment).addToBackStack(mTitle.toString());
    fragmentTransaction.commit();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接