【问题标题】:Android ViewPager inside ViewPagerViewPager 中的 Android ViewPager
【发布时间】:2016-12-25 14:54:36
【问题描述】:

我目前面临将 ViewPager 放入另一个 ViewPager 的问题,两者都可以滑动。我已经成功创建了我的第一个 ViewPager,它包含三个页面,中间的一个是第二个(内部)ViewPager,其中包含 3 个页面。

| ACTIVITY-1 | VIEWPAGER | ACTIVITY-1 |
         | AC1 | AC2 | AC3 |

父 ViewPager 在滑动时工作正常,但内部 ViewPager 无法显示内部活动,因此也无法滑动。

父 ViewPager :

public class MainSlider extends ActionBarActivity {

SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_slider);

    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());

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

}

关联的 XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
 tools:context="com.example.slidingapp.MainSlider" >

    <android.support.v4.view 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"/>
</RelativeLayout>

适配器 ViewPager:

    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 PlaceholderFragment (defined as a static inner class below).
        return PlaceholderFragment.newInstance(position + 1);
    }

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

还有片段:

   public static class PlaceholderFragment extends Fragment {

    private static final String ARG_SECTION_NUMBER = "section_number";

    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView;
        Bundle args = getArguments();

        switch (args.getInt(ARG_SECTION_NUMBER)) {
        case 1:
             rootView = inflater.inflate(R.layout.activity_first_page, container, false);
            break;
        case 2:
             rootView = inflater.inflate(R.layout.activity_second_swap, container, false);
            break;
        case 3:
             rootView = inflater.inflate(R.layout.activity_third_page, container, false);
            break;
        default:
             rootView = inflater.inflate(R.layout.fragment_main_slider, container, false);
            break;
        }

        return rootView;
    }
}    

子片段的代码与父片段的代码相同,请为子 ViewPager 提供任何解决方案,因为它无法在其中加载任何活动。

【问题讨论】:

  • 子(内部)ViewPager 工作正常,并在我从父 viewpager 单独运行时显示活动。
  • 这个问题你解决了吗?
  • 您好,您做的事情与您类似,但遇到了同样的错误。你设法解决了你的错误吗?
  • 我确实解决了这个问题并为此使用了一个库。 This 是链接。

标签: android android-fragments


【解决方案1】:

在嵌套 viewPager 的情况下,如果您的子 viewpager 不可见或无法正确滚动,则使用 getChildFragmentAdapter()

初始化您的子 viewpager(pagerAdaper 类)

【讨论】:

    【解决方案2】:

    您可以在另一个 Viewpager 中显示一个 ViewPager。您所要做的就是,假设您有三个选项卡,并且您想在第二个片段中显示您的内部 viewpager,这是要在片段 2 的 onCreateView 中编写的代码:

    viewpager=(ViewPager)getActivity().findViewById(R.id.innerpager);
        Innerpager innerpagerr = new Innerpager(getActivity().getSupportFragmentManager());
        viewpager.setAdapter(innerpagerr);
        viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
            }
    
            @Override
            public void onPageSelected(int position) {
    
            }
    
            @Override
            public void onPageScrollStateChanged(int state) {
    
            }
        });
    
    }
    

    无论你想在innerViewpager片段中显示什么,为每个片段单独设计它们的布局。在FragmentpagerAdpater类中编写以下代码:

    public class Innerpager extends FragmentStatePagerAdapter {
    private Context _context;
    int num_of_frags = 2;
    
    
    public Innerpager(FragmentManager fm) {
        super(fm);
    
    }
    
    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0: // Fragment # 0 - This will show FirstFragment
                return Innerlist.newInstance(0, "one");
            case 1: // Fragment # 0 - This will show FirstFragment different title
                return Innerlist2.newInstance(1, "two");
            case 2: // Fragment # 1 - This will show SecondFragment
                return Innerlist2.newInstance(2, "Page # 3");
            default:
                return null;
        }
    }
    
    
    @Override
    public int getCount() {
        return num_of_frags;
    }}
    

    在您的片段中创建每个片段的新实例,如下所示:

     public static Innerlist newInstance(int page, String title) {
        Innerlist fragmentFirst = new Innerlist();
        Bundle args = new Bundle();
        args.putInt("100", page);
        args.putString("one", title);
        fragmentFirst.setArguments(args);
        return fragmentFirst;
    }
    

    就是这样!!现在您作为 Viewpager 的主要活动控制三个片段,即片段 1、片段 2、片段 3,并且在片段 2 内部您有上面的代码。希望这对您有帮助。祝您编码愉快!

    【讨论】:

      【解决方案3】:

      我认为不可能在视图寻呼机中插入视图寻呼机,因为我们无法为两者提供滚动。您需要为内部寻呼机创建自定义视图。你可以找到更好的解决方案here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-28
        • 2018-05-14
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多