Android:导航抽屉片段内的Viewpager

Posted

技术标签:

【中文标题】Android:导航抽屉片段内的Viewpager【英文标题】:Android: Viewpager inside a fragment of Navigation Drawer 【发布时间】:2014-05-22 23:52:48 【问题描述】:

我目前正在开发一个 android 应用程序,我需要在 Navigation Drawer 的片段中实现 Viewpager 或 Tabs。我已经实现了本教程中的导航抽屉:Navigation Drawer Tutorial

现在我的导航抽屉由 3 个片段组成。 片段 A、片段 B、片段 C

Fragment A上,我怎样才能为这个Fragment添加一个Viewpager?

【问题讨论】:

【参考方案1】:

这绝对是可能的。您只需要为 viewpager 使用子片段。除此之外,实现很简单。创建自定义寻呼机适配器,使用标准的 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 的布局,然后确保在 Fragment A 中像这样连接它:

myPagerAdapter = new MyPagerAdapter(this.getChildFragmentManager());
myPager = (ViewPager) mRoot.findViewById(R.id.pager);
myPager.setAdapter(myPagerAdapter);

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

【讨论】:

【参考方案2】:

这对于 Android Fragment 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_
    android:layout_
    tools:context="com.example.yourapp.YourActivity" />

然后在您的FragmentPagerAdapter.getItem(int position) 方法中,返回您希望在ViewPager 中显示的Fragment,就像您在“普通”ViewPager 中所做的那样。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

给你..首先是选项卡式或视图分页器片段类..

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_
android:layout_>

<!--
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_
    android:layout_
    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();

【讨论】:

以上是关于Android:导航抽屉片段内的Viewpager的主要内容,如果未能解决你的问题,请参考以下文章

带有导航抽屉的片段中的 ListView 和 ViewPager

处理导航抽屉内的 ViewPager 滑动

在导航抽屉片段中保存视图页面片段的状态

如何使用导航抽屉和viewpager/viewpager2在java中制作android应用程序

导航抽屉的片段管理

带有许多片段的 Android 导航抽屉